mysql - 如何检查一对多表中的重复项
问题描述
我有一个存储人们服装的系统。每套服装包含 1 到多个项目。
因此我的桌子是这样的
outfits
+-----------+--------+
| outfit_id | cus_id |
+-----------+--------+
| 1 | 5 |
| 2 | 92 |
+-----------+--------+
items
+---------+-------+-------+
| item_id | name | sku |
+---------+-------+-------+
| 1 | hat | 1111 |
| 2 | pants | 2222 |
| 3 | shirt | 3333 |
| 4 | shoes | 4444 |
+---------+-------+-------+
items_in_outfit
+--------+-----------+---------+
| ino_id | outfit_id | item_id |
+--------+-----------+---------+
| 1 | 1 | 3 |
| 2 | 1 | 2 |
| 3 | 1 | 4 |
| 4 | 2 | 1 |
| 4 | 2 | 3 |
+--------+-----------+---------+
我得到了这个信息:
cus_id=92
想用sku
's1111
和3333
但是,这是outfit_id=2
. 所以我想让 mysql 返回我的outfit_id
2。如果它不是重复的,则什么也不返回。仅当同一 cus_id
人试图制作已经具有完全相同 的服装时,它才算作重复sku
。
如果cus_id=5
想用sku
's1111
和3333
. 它不应该返回任何内容(因为它不是重复的),因为cus_id=5
它没有与 just1111
和3333
SELECT o.outfit_id FROM
outfits o JOIN
items_in_outfit iio
ON o.outfit_id = iio.outfit_id JOIN
items i
ON iio.item_id = i.item_id
WHERE cus_id = 92 AND ...
解决方案
这可以帮助您实现您正在寻找的东西:
select
cus_id
from(
select
cus_id,
group_concat(sku order by sku asc) as items
from outfits o
join items_in_outfit iio on o.outfit_id = iio.outfit_id
join items i on iio.item_id = i.item_id
group by cus_id
) T
where items = '1111,3333'
编辑:由于服装不能包含超过 1 个相同项目的实例,因此此解决方案可能对您更好,因为您不必在 php 中订购 sku id 之前:
select
o.outfit_id
from
outfits o
join items_in_outfit iio on o.outfit_id = iio.outfit_id
join items i on iio.item_id = i.item_id
where sku IN (1111, 3333)
group by o.outfit_id having COUNT(*) = 2
推荐阅读
- java - base64 编码的签名属性 DER 结构中的消息摘要
- python - 具有生成中间带有通配符的回文字符串的功能。需要帮助来改进它
- c++ - 为什么 C 语言不是面向对象的语言,即使它具有与 C++ 的 Class 关键字相同的(结构)struct 关键字?
- amazon-web-services - AWS Cloudwatch 仪表板自定义时间范围
- mongodb - Mongodb Atlas Charts - 在不同的列中显示分组计数
- c++ - 让 C++ 结构成员指向其中的另一个成员是否合法
- python - 如何最小化 Matplotlib 中子图之间的空间?
- react-native - React Native:如何使用 Context Api 在 HeaderRight 自定义组件中显示屏幕状态变量更新
- mysql - mysql选择json
- javascript - 在 React 中基于路由匹配类的问题