MYSQL - 获取所有选定类别中的行
Posted
技术标签:
【中文标题】MYSQL - 获取所有选定类别中的行【英文标题】:MYSQL - Get rows in all the selected categories 【发布时间】:2011-06-01 13:27:54 【问题描述】:我正在尝试向 mysql 数据库写入查询,该数据库查询与所有选定类别有关系的产品
产品表
product_id | product_name
---------------------------------
1 | product name one
2 | product name two
3 | product three
分类表
category_id | category_name
1 | category one
2 | category two
3 | category three
Category_relationship 表
product_id | category_id
--------------------------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
3 | 3
例如:
已选择类别 ID 的 1 和 3 只有要返回的 product_id 为 '1'【问题讨论】:
【参考方案1】:使用 2 个 JOIN
SELECT
p.*
FROM products p
JOIN category_relationship r1
ON r1.product_id = p.product_id
JOIN category_relationship r2
ON r2.product_id = p.product_id
WHERE r1.category_id = 1
AND r2.category_id = 3
使用 GROUP BY
SELECT
p.*
FROM products p
JOIN category_relationship r
ON r.product_id = p.product_id
WHERE r.category_id IN (1,3)
GROUP BY p.product_id
HAVING COUNT(*) = 2 <-- number of category ids
这取决于您的表大小和数据分布,但我猜第一个查询会更快。
但是,如果您要检查各种大小的列表(使用 3、4、... 类别 ID),则必须动态构建第一个查询,而第二个查询可以轻松调整。
【讨论】:
【参考方案2】:加入两次:
select p.*
from products p
join category_relationship c1 on c1.product_id = p.product_id
and c1.category_id = 1
join category_relationship c2 on c2.product_id = p.product_id
and c2.category_id = 3
【讨论】:
你的意思是join category_relationship
,不是join categories
,对吧?
是的。我没有完全按照他的模式名称进行操作。固定。【参考方案3】:
试试这个:
SELECT DISTINCT product_id FROM category_relationship WHERE category_id IN (1, 3)
【讨论】:
【参考方案4】:例如:
SELECT *
FROM Products P, Category_relationship CP
WHERE P.product_id = CP.product_id
AND CP.category_id IN (1,3)
【讨论】:
【参考方案5】:SELECT p.product_id, p.product_name
FROM products p LEFT JOIN category_relationship cp ON p.product_id = cp.product_id
GROUP BY p.product_id, p.product_name
HAVING COUNT(cp.category_id) = (SELECT COUNT(*) FROM categories)
【讨论】:
以上是关于MYSQL - 获取所有选定类别中的行的主要内容,如果未能解决你的问题,请参考以下文章