mysql - Sql 查询获取与标志关联的产品

标签 mysql sql group-by

我有一个如下所示的 flags_products 表(标志和产品之间的多对多关系),

flags_products : 

flag_id --  product_id  
1      --   1   
2      --   1  
3      --   1  
1      --   2  
2      --   2  
4      --   2

用于获取具有与产品 (product_id) 关联的标志(flag_id 1 和 2)的行的 SQL 查询是什么?显然:

  SELECT * 
    FROM flags_products 
   WHERE flag_id = 1 
     AND flag_id = 2 
GROUP BY product_id;

...不起作用,并给出一个空集。那么正确的查询是什么?

最佳答案

您应该采取的具体方法取决于您的更大要求。这是一种可能的解决方案:

SELECT
    product_id
FROM
    Some_Table
WHERE
    flag_id IN (1, 2)
GROUP BY
    product_id
HAVING
    COUNT(*) = 2

只要不能有重复项,此方法就有效。如果一个产品可以使用相同的 flag_id 标记两次,那么您需要:

SELECT
    product_id
FROM
    Some_Table
WHERE
    flag_id IN (1, 2)
GROUP BY
    product_id
HAVING
    COUNT(DISTINCT flag_id) = 2

在这两种情况下,您都需要 GROUP BY以匹配您的列列表。 MySQL 不需要这样才能运行查询(我认为是一个缺陷,但我会将该参数保存到另一个时间),但是对于不在 GROUP BY 中的列,结果将无法确定。 。您还可以使用上述查询作为子查询,然后可以将其连接到另一个表或多个表。

如果您知道您要查找的始终是两个标志,那么您可以使用 EXISTS:

SELECT
    T1.product_id
FROM
    Some_Table T1
WHERE
    EXISTS (
            SELECT *
            FROM
                Some_Table T2
            WHERE
                T2.product_id = T1.product_id AND
                T2.flag_id = 1
           ) AND
    EXISTS (
            SELECT *
            FROM
                Some_Table T2
            WHERE
                T2.product_id = T1.product_id AND
                T2.flag_id = 2
            )

但性能可能不是很好。

关于mysql - Sql 查询获取与标志关联的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667975/

相关文章:

java - 如何: Android Quiz App,提取da

mysql - 存储过程空错误

Mysql在高峰时段开始断开连接

mysql - 复合键的 1 列出现重复输入错误

sql - 插入返回类型?

python - 如何获得两个数据帧的条件值之和之间的差异?

php - cUrl 打开多个 URL

SQLite 相当于 PostgreSQL 的 GREATEST 函数

sql-server - SQL 按日期分组

sql - 在 postgres 中使用不同的日期和聚合函数