Mysql多次加入计数

时间:2016-04-16 08:48:45

标签: mysql sql join count

有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)

4 个答案:

答案 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)

一步一步地做。检查记录是否存在时,请使用EXISTSIN。您需要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 50111,因此,我建议您移动category_id product_tags表。