我有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? 但我无法弄清楚如何改变它让自己工作。
答案 0 :(得分:0)
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 '|')
)。