首页 > 解决方案 > 如何检查一对多表中的重复项

问题描述

我有一个存储人们服装的系统。每套服装包含 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 |
+--------+-----------+---------+

我得到了这个信息:

但是,这是outfit_id=2. 所以我想让 mysql 返回我的outfit_id2。如果它不是重复的,则什么也不返回。仅当同一 cus_id人试图制作已经具有完全相同 的服装时,它才算作重复sku

如果cus_id=5想用sku's11113333. 它不应该返回任何内容(因为它不是重复的),因为cus_id=5它没有与 just11113333

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 ...

标签: mysqlsqldatabaseselect

解决方案


这可以帮助您实现您正在寻找的东西:

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

在此处查看第二个演示


推荐阅读