0

我有三个mysql表

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手册中所述,我已经尝试了AND和嵌套的NOT EXISTS。

没有任何效果。

更新: 我想出了这个。

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

有没有更好的办法?

4

3 回答 3

1

我知道这可以被美化并放入一个查询中(您可以将类别计数嵌套在有而不是作为单独的查询中......我只是认为这更具可读性),但这是我的镜头:

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
)
于 2012-03-27T05:39:57.680 回答
0

您可以使用这样的“IN”子句来完成此操作:

SELECT i.* 
FROM items i
WHERE i.id IN (SELECT item_id from items_in_categories where category_id IN (3,5))
于 2012-03-27T05:33:48.947 回答
-1
select * from items i , items_in_categories iic, categories c where i.id = iic.item_id and iic.category_id = c.id and c.id in(select * from category where id in(3,5))

如果您没有从上述查询中获得不同的项目,您可以在项目的 id 上添加 DISTINCT。

于 2012-03-27T05:34:29.880 回答