有3张桌子
product_tags
product_id | tag
___________________
50 | new
50 | blac
66 | new
50 | green
111 | new
111 | white
products_to_categories
product_id | category_id
____________________
50 | 69
50 | 68
111 | 40
111 | 70
类别
category_id | parent_id (parent category id)
____________________
68 | 0
69 | 68
70 | 68
需要所有标记按类别68中的受欢迎程度(计数产品)排序及其所有子类别(父类ID为68的所有类别)
我的开始查询给出了错误的结果
SELECT tag
FROM product_tags opd
LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id
LEFT JOIN categories optx ON optx.parent_id = '68'
WHERE opd.tag <> ''
AND optx.parent_id = '68'
ORDER BY optc.product_id DESC
我需要的结果
tags
_____
new (2)
white (1)
答案 0 :(得分:1)
首先,您的Join
类别不正确。它应该是:
LEFT JOIN categories optx ON optx.parent_id = optc.category_id
然后,为了获得正确的count()
,您应该执行GROUP BY
标记:
SELECT CONCAT(opd.tag, ' (', count(*), ')' )
FROM product_tags opd
LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id
LEFT JOIN categories optx ON optx.parent_id = optc.category_id
WHERE opd.tag <> ''
AND optx.parent_id = '68'
GROUP BY opd.tag
答案 1 :(得分:1)
我认为您最大的问题是您对数据以及它们如何拼凑起来感到困惑。我已经重写了你的查询删除你的别名,以便你可以清楚地看到你的连接发生了什么。
SELECT tag, COUNT(*) AS Num
FROM product_tags
LEFT JOIN products_to_categories ON product_tags.product_id = product_to_categories.product_id
LEFT JOIN categories ON product_to_categories.category_id = categories.category_id
WHERE product_tags.tag <> '' AND categories.parent_id = '68'
GROUP BY tag
ORDER BY Num DESC
然后,我会使用您的表示层来处理您的数据的呈现&#34;新的(2)&#34;等
希望这有帮助。
答案 2 :(得分:1)
一步一步地做。检查记录是否存在时,请使用EXISTS
或IN
。您需要category_ids 68及其子项集合中的product_ids:
select tag, count(*)
from product_tags
where product_id in
(
select product_id
from products_to_categories
where category_id = 68
or category_id in
(
select category_id
from categories
where parent_id = 68
)
)
group by tag
order by count(*) desc;
答案 3 :(得分:-2)
我认为您的表格存在问题,因为您无法区分产品ID 50
和111
,因此,我建议您移动category_id
product_tags
表。