mysql连接-如何查找属于所有家长的所有子项
我有三张桌子mysql连接-如何查找属于所有家长的所有子项,mysql,inner-join,not-exists,Mysql,Inner Join,Not Exists,我有三张桌子 items =========== id title items_in_categories ============================ id item_id category_id categories =========== id title 我想找到属于所有指定类别的所有项目。不是任何一个类别,而是所有类别 例如,如果我想搜索属于类别id 3和5的所有项目 要搜索的可能类别的数量最多可达20个 例如,我想获得属于类别id 1、2、3
items
===========
id title
items_in_categories
============================
id item_id category_id
categories
===========
id title
我想找到属于所有指定类别的所有项目。不是任何一个类别,而是所有类别
例如,如果我想搜索属于类别id 3和5的所有项目
要搜索的可能类别的数量最多可达20个
例如,我想获得属于类别id 1、2、3、4、5、6……的所有项目。。。。和20
我想使用尽可能简单的方法
我已经试过了,但是一个嵌套的数据库并不存在,正如mysql手册中所说的那样
什么都没用
更新:
我想到了这个
select * from
(select count(*) as counter, item_id from items_in_categories
where category_id in (3, 5) group by item_id)getall
where counter = 2
有更好的方法吗?您可以使用以下IN子句来实现:
SELECT i.*
FROM items i
WHERE i.id IN (SELECT item_id from items_in_categories where category_id IN (3,5))
如果您没有从上面的查询中获得不同的项,您可以在项的id上添加不同的项。我知道这可以被预绑定并放入一个查询中,您可以将类别计数嵌套在having中,而不是作为单独的查询…我只是认为这更具可读性,但下面是我的尝试:
DECLARE @CategoryCount INT;
SELECT @CategoryCount = COUNT(DISTINCT id) AS CategoryCount
FROM categories
WHERE category_id IN (3,5);
SELECT *
FROM items
WHERE item_id IN
(
SELECT item_id
FROM items_in_categories
WHERE items_in_categories.category_id IN (3,5)
GROUP BY item_id
HAVING COUNT(DISTINCT category_id) = @CategoryCount
)
我想出了这个select*from select count*作为计数器,item_id from items_in_categories其中category_id在3,5 group by item_idgetall其中counter=2有更好的方法吗?不错,但是1。评论是为了评论。答案是为了答案:2。您应该进行一次不同的计数,否则如果您有多个匹配项为3,但没有5,则计数将失败。所以我应该像其他人一样给出我自己的答案是吗?啊。。。。你是对的。可能存在3的多个匹配项。我没有注意到这一点。谢谢你,贾斯汀,很乐意帮忙。是的,如果你比别人先解决你的答案,那么你可以把它作为一个答案,但前提是你确定它是解决方案。不过,你必须等待24个多小时才能接受自己的答案。这允许其他人解决这个问题。这将得到3个匹配项,而不是5个匹配项,反之亦然。OP只有在同时拥有3和5的情况下才想要结果。3,5中的类别id不应该同时给出3和5结果吗?@JustinPihony是对的。如果至少有一个类别,IN子句将提供匹配项。并非所有这些都会得到3或5的匹配。OP需要3和5。你的答案与我的第一次尝试类似吗?@kimsia是的,唯一的区别是我使用不同的计数来确保2行3不起作用。如果3和5匹配,则DISTINCT强制返回结果。它忽略相同类别的重复。我将接受此答案。我没有太多时间等待更好的解决方案。希望有一个更好的答案,我不太抱希望,这个答案会更高。谢谢你,贾斯汀:
DECLARE @CategoryCount INT;
SELECT @CategoryCount = COUNT(DISTINCT id) AS CategoryCount
FROM categories
WHERE category_id IN (3,5);
SELECT *
FROM items
WHERE item_id IN
(
SELECT item_id
FROM items_in_categories
WHERE items_in_categories.category_id IN (3,5)
GROUP BY item_id
HAVING COUNT(DISTINCT category_id) = @CategoryCount
)