我有一个如下所示的 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/