Mysql组concat与计数项目

时间:2017-01-18 09:36:15

标签: mysql

我有2张桌子,' item'和'propvalues',propvalues有property_id和value列,我试图得到的是将propvalues组合为property_id,并计算他们有多少相似的值。

我知道它与另一个问题类似,但我无法弄清楚如何改变它让自己工作。如果有人擅长mysql请不要将其标记为重复的问题,而是试着给我至少一些建议。我不明白当有内部选择陈述时发生了什么

以下是表格:

'item'
  id    category_id
   1         1
   2         1
   3         2
   4         5
   etc.

'propvalues'
  id    item_id    property_id       value
  1       1           3               'blue'
  2       1           3               'blue'
  3       1           3               'blue'
  4       1           3               'red'
  5       1           5               'blue'
  6       1           5               'red'
  7       2           5               'red'

SELECT propvalues.property_id,
GROUP_CONCAT(propvalues.value) 
FROM propvalues JOIN item ON item.id = propvalues.item_id
WHERE item.category_id = 1 || item.category_id = 2
GROUP BY propvalues.property_id

这会给出这个结果:

property_id      value
    3          blue,blue,blue,red
    5          blue,red,red

但是我需要这个,结果,我只想要唯一的值,并计算它们:

3        blue,3|red,1
5        blue,1|red,2

任何想法? 我在这里找到了一些解决方案:mysql group_concat with a count inside? 但我无法弄清楚如何改变它让自己工作。

1 个答案:

答案 0 :(得分:0)

派生自refered duplicate

SELECT property_id, GROUP_CONCAT(CONCAT(value, ',', cnt) SEPARATOR '|')
FROM (
    SELECT property_id, value, COUNT(value) AS cnt
    FROM propvalues
    JOIN item ON item.id = propvalues.item_id
        AND item.category_id IN (1, 2)
    GROUP BY property_id, value
) t
GROUP BY property_id

为了将其分解,内部子查询为每个property_id提取了许多不同的值:

+-------------+-------+-----+
| property_id | value | cnt |
+-------------+-------+-----+
|           3 | blue  |   3 |
|           3 | red   |   1 |
|           5 | blue  |   1 |
|           5 | red   |   2 |
+-------------+-------+-----+

外部主查询通过distinct property_id进一步聚合这些值,将value和count连接到一个字符串(CONCAT(value, ',', cnt)),然后连接每一行(GROUP_CONCAT(... SEPARATOR '|'))。