我具有one_to_many
关系,其中我有3个表images
,items
和image_items
..每个图像可能有一个或多个项目,我想查询一个我通过商品/商品ID / ID,并根据该图片中商品的数量获取一幅特定图片(恰好是一张图片)...
这是我到目前为止尝试过的方法,但是它有问题,它给我的图像的计数或更多,我不确定此逻辑或结构是否首先有效:
SELECT `image_items`.`image_id`
FROM `image_items`
WHERE `image_items`.`item_id` IN(1, 2)
GROUP BY `image_items`.`image_id`
HAVING count(image_items.image_id) = 2
这里是fiddle
让我们说图像(1)有项目(1,2,3),图像(2)有项目(1,3),图像(3)有项目(1,2)..可以说我想要图像在我的查询中恰好有(1,2)..即使有不同的查询,当我只需要图像(3)时,它也会给我图像(1,3)。
答案 0 :(得分:3)
删除WHERE子句,并在HAVING子句中添加一个条件:
SELECT image_id
FROM image_items
GROUP BY image_id
HAVING
COUNT(DISTINCT item_id) = 2
AND
SUM(item_id NOT IN (1, 2)) = 0
请参见demo。
结果:
| image_id |
| -------- |
| 4 |
答案 1 :(得分:1)
Forpas的解决方案是一个很好的解决方案。一个更简单的having
子句是:
SELECT image_id
FROM image_items
GROUP BY image_id
HAVING GROUP_CONCAT(item_id ORDER BY item_id) = '1,2';
如果您要在应用程序中构造此查询,则这会更简单,因为您只需要传递一个值,即字符串'1,2'
。
答案 2 :(得分:0)
我希望您需要在DISTINCT
子句中使用HAVING
作为HAVING COUNT(DISTINCT
image_id ) = 2
来获得准确的计数。
SELECT `image_id`
FROM `image_items`
WHERE `item_id` IN (1, 2)
GROUP BY `image_id`
HAVING COUNT(DISTINCT `image_id`) = 2