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 - 获取所有选定类别中的行的主要内容,如果未能解决你的问题,请参考以下文章

如何根据选定的列而不是Oracle中表的所有列获取不同的行

比较两列的值小于或等于并在mysql中获取选定的行?

WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?

如何使用数据表在警报中获取多个选定的行数据

存储选定的行 ID

从datagridview中删除所有选定的行