我有3张桌子:


store_cat:类别
store_cat_attribute:每个类别的属性
store_item:可以链接到类别的项目


我需要一个返回包含以下列的行的查询:


类别:Attribute1,Attribute2,Attribute3
项目数


这是我当前的查询,几乎可以正常工作:

SELECT store_cat.id_cat AS id,
CONCAT(store_cat.name, IFNULL(CONCAT(": ", GROUP_CONCAT(store_cat_attribute.name ORDER BY store_cat_attribute.position SEPARATOR ", "), ""), "")) AS name,
COUNT(DISTINCT store_item.id_item) AS products
FROM store_cat
LEFT JOIN store_item ON store_item.id_cat = store_cat.id_cat
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat
ORDER BY name


问题是奇怪的是,在其中一行中,name列正在复制GROUP_CONCAT中的属性:

类别:Attribute1,Attribute1,Attribute2,Attribute2,Attribute3,Attribute3

关于为什么发生这种情况以及如何解决的任何想法?谢谢!

在这里您可以检查sqlfiddle:http://sqlfiddle.com/#!9/7da2d3/5

最佳答案

您正在同一查询中计算两个不同的事物(GROUP_CONCATCOUNT)。 JOINstore_item将导致重复。您可以将其移到选择列中:

SELECT
  store_cat.id_cat AS id,
  CONCAT(store_cat.name, IFNULL(CONCAT(": ",
    GROUP_CONCAT(
       store_cat_attribute.name
      ORDER BY store_cat_attribute.position
      SEPARATOR ", "
    ), ""
    ), ""
   )) AS name,
   (select count(distinct store_item.id_item) from store_item where store_item.id_cat = store_cat.id_cat) AS products
FROM store_cat
  LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_cat.id_cat
WHERE store_cat.id_store = 1
GROUP BY store_cat.id_cat, store_cat.name
ORDER BY name


http://sqlfiddle.com/#!9/7da2d3/36

09-05 12:38