MySQL Query:GROUP BY而不会丢失结果中的行

时间:2016-01-15 22:56:13

标签: mysql

我写了一个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是否可以实现这一点?

1 个答案:

答案 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    ║
╚════╩════════════╩═════════════════╩════════════════╝