【问题标题】:How to check for duplicates in a 1 to many table如何检查一对多表中的重复项
【发布时间】:2024-05-29 13:25:02
【问题描述】:

我有一个存储人们服装的系统。每套服装包含 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 想用sku11113333 打造另一套服装

但是,这是 outfit_id=2 的副本。所以我希望 mysql 将 2 的 outfit_id 返回给我。如果它不是重复的,则不返回任何内容。仅当 相同 cus_id 尝试制作的服装已经完全相同 sku 时,才算作重复。

如果cus_id=5 想用sku11113333 创建另一套服装。它应该什么都不返回(因为它不是重复的)因为cus_id=5 没有只有11113333 的装备

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

【问题讨论】:

  • 这是homework question吗?
  • @Barmar 不,这是我自己的项目。我看到 mysql 无法在一对多的关系中创建唯一键。我的尝试是在 PHP 中,它太慢了,因为我将 SKU 连接成一个字符串并检查该字符串是否与提供给我的 sku 相同。我不确定如何做到这一点,因为它是一对多的关系
  • @Barmar 这是一个一对多的关系表。我理解,使用 1 对 1 表更容易。
  • 你是如何驾驶它的——它是一个存储过程吗?你是如何传递 SKU 的?还是将它们写入请求表?

标签: mysql sql database select


【解决方案1】:

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

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'

SEE DEMO HERE

编辑:由于一件装备不能包含超过 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

SEE SECOND DEMO HERE

【讨论】:

  • 是的,当然,只需在您的 php 中以正确的顺序连接它们
  • 哦,真的。你也可以这样做
  • 正如barmar所说,也可能有更好的解决方案,但这取决于一件事,一个装备ID可以多次具有相同的item_id吗?
  • 没有。例如,outfit_id 只能有一个 item_id 的实例。所以这件衣服是不可能的1111,1111,3333。但是,outfit_id 是可能的,1111,3333。有更好的解决方案吗?
  • 看我上面的编辑,这对你的情况可能会好一点
最近更新 更多