Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql连接-如何查找属于所有家长的所有子项_Mysql_Inner Join_Not Exists - Fatal编程技术网

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
)