我写了一个MySQL查询,但我对输出不太满意。
查询如下所示:
SELECT
f.id,
s.time,
f.name,
f.value
FROM
entries s,
entry_details f
WHERE
f.id = s.id AND (f.name = 'fruit' OR f.name = 'vegetable');
产生这个结果:
id | time | name | value
---|------------|-----------|--------
4 | 2016-01-14 | fruit | banana
4 | 2016-01-14 | vegetable | carrot
5 | 2016-01-14 | fruit | apple
5 | 2016-01-14 | vegetable | corn
虽然所需的所有信息都在那里,但我想知道是否有办法将f.id
的所有结果合并为一行?
使用GROUP BY f.id
我达到了我想要的效果,但vegetable
行消失了。
单独使用MySQL是否可以实现这一点?
答案 0 :(得分:2)
是的,但您需要合并(聚合)休息列:
SELECT
f.id,
MAX(s.time) AS `time`,
GROUP_CONCAT(f.name) AS `name`,
GROUP_CONCAT(f.value) AS `value`
FROM entries s
JOIN entry_details f
ON f.id = s.id
WHERE f.name IN('fruit', 'vegetable')
GROUP BY f.id;
避免使用旧的逗号连接语法,而是使用较新的JOIN
。
输出:
╔════╦════════════╦═════════════════╦════════════════╗
║ id ║ time ║ name ║ value ║
╠════╬════════════╬═════════════════╬════════════════╣
║ 4 ║ 2016-01-14 ║ fruit,vegetable ║ banana, carrot ║
║ 5 ║ 2016-01-14 ║ fruit,vegetable ║ apple, corn ║
╚════╩════════════╩═════════════════╩════════════════╝