php – MySQL查询问题..我放弃了!

*更新,似乎给出了答案,但SQL查询他的错误..任何人都可以帮忙吗?看到第一个答案,我在那里发布了问题.

所以简单地说.我有3张桌子. “项目”表和“标签”表.然后我还有一个“item_tag”表,将2连在一起.

我想创建一个查询,列出分配了特定标签的所有项目.所以我希望查询列出所有应用了标签x和标签y的项目.

这是我到目前为止所提出的…除了这将列出任何匹配标签ID 148或标签ID 152.如果我说它“AND”它没有显示任何结果.

SELECT *
FROM (`item`)
RIGHT OUTER JOIN `item_tag` ON `item`.`id` = `item_tag`.`fk_item_id`
WHERE `item_tag`.`fk_tag_id` = "152" OR `item_tag`.`fk_tag_id` = "148"
GROUP BY `item`.`id`

解决方法:

您可以使用此查询获取包含所需标记的项目的ID:

SELECT fk_item_id
FROM item_tag
WHERE fk_tag_id IN (5,10,15)
GROUP BY fk_item_id
HAVING COUNT(*) = 3

然后就是

SELECT * 
FROM item 
WHERE id 
IN 
(
    SELECT fk_item_id
    FROM item_tag
    WHERE fk_tag_id IN (5,10,15)
    GROUP BY fk_item_id
    HAVING COUNT(*) = 3
)

你只需要修改id和3,即那些id的计数.

当您的表没有UNIQUE约束(它应该有)并且特定项目中可以有相同的标记时,您应该将查询修改为:

SELECT * 
FROM item 
WHERE id 
IN 
(
    SELECT fk_item_id
    FROM ( SELECT disTINCT fk_item_id, fk_tag_id FROM item_tag ) someAlias
    WHERE fk_tag_id IN (5,10,15)
    GROUP BY fk_item_id
    HAVING COUNT(*) = 3
)

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...