我有这两个表,内容项和连接表的类别.我只需要一个查询来 Select 多个类别中的项目(在所有类别中,而不是在任何类别中).
-- content items
CREATE TABLE `items` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
[...]
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- a join table to a categories table
CREATE TABLE `item_categories` (
`item_id` bigint(20) DEFAULT NULL,
`category_id` bigint(20) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
下面是一个在连接表中 Select 这两个类别中的条目的查询:
SELECT `item_categories`.* FROM `item_categories`
WHERE `item_categories`.`category_id` IN (11811, 11911)
现在把它和Items表结合起来,我就可以得到任何类别的项目.简单:
SELECT DISTINCT `items`.* FROM `items`
INNER JOIN `item_categories` ON `item_categories`.`item_id` = `items`.`id`
WHERE `item_categories`.`category_id` IN (11811, 11911)
是的,这有点傻,但try 使用AND(每次结果为0):
SELECT DISTINCT `items`.* FROM `items`
INNER JOIN `item_categories` ON `item_categories`.`item_id` = `items`.`id`
WHERE `item_categories`.`category_id` = 11811
AND `item_categories`.`category_id` = 11911
这是我最接近的一次了.这似乎过于复杂,这是一种手动连接,每个类别都有WHERE ID IN
分:
SELECT DISTINCT `items`.* FROM `items`
WHERE ID IN (
SELECT `item_categories`.item_id FROM `item_categories`
WHERE `item_categories`.`category_id` = 11811
)
AND ID IN (
SELECT `item_categories`.item_id FROM `item_categories`
WHERE `item_categories`.`category_id` = 11911
)
有没有更好(更简单)的方法来实现这一点?
我在想,一定有一种方法可以在带有自联接或GROUP BY的联接上设置条件,以便在所有类别中只 Select ITEM_CATEGORES.