如何返回与查询结果相关的所有类别ID?
items_cats: (many to many)
product_id | category_id
====================
1 | 1
1 | 2
1 | 4
1 | 7
2 | 1
2 | 3
2 | 4
2 | 7
3 | 1
3 | 3
3 | 4
3 | 8
在下面的查询中,我获得了包含category_id 3和category_id 7的所有产品ID 但我也想知道哪个category_id(选项)仍然有选择的producs_id:
例如,我喜欢这个查询返回(基于代码示例):
-product_id = 2
-category_id:7,3,4,1
使用此功能时,我可能会想查看每页最多项目的查询。
代码I;到目前为止:SELECT
DISTINCT t1.product_id, t1.category_id
FROM
items_cats t1
INNER JOIN
items_cats t1b
ON t1.product_id =t1b.product_id
WHERE
t1.category_id=3 AND
t1b.category_id=7
cat id的松散查询问题:
SELECT
e1.category_id
FROM
drinks_ingredients e1
WHERE
e1.category_id=2
当然它返回2但我喜欢它返回1,2,4,7。
另一种方式是工作,但我如何通过大量产品和类别提高效率?我是否可以将这些查询结合起来。
SELECT DISTINCT
t1.category_id
FROM items_cats t1
WHERE t1.product_id = 2
答案 0 :(得分:1)
我确信还有其他方法可以做到这一点,但这里有一个。
首先,我们需要弄清楚我们感兴趣的product_id
。您可以计算每个product_id
所需的类别数量:
SELECT product_id, count(category_id) as numcats
FROM items_cats
WHERE category_id IN (3,7)
GROUP BY product_id;
+------------+---------+
| product_id | numcats |
+------------+---------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
+------------+---------+
由于我们指定了两个category_id
(3和7),因此我们只对product_id
count(category_id) = 2
感兴趣。因此,在末尾添加HAVING numcats=2
:
SELECT product_id, COUNT(category_id) as numcats
FROM items_cats
WHERE category_id IN (3,7)
GROUP BY product_id
HAVING numcats=2;
# (returns all product_id with both category_id=3 and 7.
所以这里是我们想要product_id
的所有category_id
。
然后我们只选择上一个表中category_id
所有的product_id
:
SELECT DISTINCT category_id
FROM items_cats
WHERE product_id IN
(SELECT product_id
FROM items_cats
WHERE category_id IN (3,7)
GROUP BY product_id
HAVING COUNT(category_id)=2);
+-------------+
| category_id |
+-------------+
| 1 |
| 3 |
| 4 |
| 7 |
+-------------+