我有这两个表,内容项和连接表的类别.我只需要一个查询来 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.

推荐答案

使用Aggregate in item_categories获取属于所有类别的item_id:

SELECT *
FROM items
WHERE id IN (
  SELECT item_id 
  FROM item_categories
  WHERE category_id IN (11811, 11911)
  GROUP BY item_id
  HAVING COUNT(DISTINCT category_id) = 2 -- the number of categories
);

I don't see in the definition of item_categories any unique constraint for the combination of item_id and category_id.
If there is one, you may remove DISTINCT from the HAVING clause.

Mysql相关问答推荐

在MySQL中存储一条帖子的点赞数量

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

含有子查询的MySQL函数出现语法错误

在MySQL中使用FIRST_VALUE()

使用 presto 或 mysql 添加每个组中的缺失值

在 mySQL 中计算每日数组的每周指标

如何创建一个列,该列在另一个表中具有值的计数?

如何更新一个巨大的表的 50k 行?

MySQL,递归 CTE.它如何以这种句法形式工作?

仅计算 DATEDIFF (MySQL) 中的工作日

mySql 查询运行速度超慢

使用数据表的直方图(SQL 查询)

查询mysql中无法识别数据值

基于 2 列的重复行的 SQL 查询

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

在 MySQL 中,我应该 Select 哪种排序规则?

mysql 按日期 Select 总和组

MySQL计算特定值的列

如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

在 MySQL 中仅 Select 仅包含字母数字字符的行