简体   繁体   English

MySQL - 将行合并为一个

[英]MySQL - Combine rows into one

I searched through various questions but I didn't find an answer. 我搜索了各种问题,但我找不到答案。 I have a MySQL table 'teams': 我有一个MySQL表'团队':

+--+----+------+
|id|name|active|
+--+----+------+
|1 |bla |1     |
|2 |blu |0     |
|3 |croc|1     |
|4 |bold|1     |
|5 |foo |1     |
|6 |bar |0     |
+--+----+------+

and a table 'data': 和表'数据':

+----+-------+----+
|team|project|time|
+----+-------+----+
|2   |some   |1   |
|2   |some2  |5   |
|3   |one    |16  |
|3   |one2   |100 |
|5   |more   |2   |
|5   |more2  |60  |
+----+-------+----+

In PHP I'm querying the data like this: 在PHP中,我正在查询这样的数据:

SELECT t.name, t.active, d.time
FROM teams t
RIGHT JOIN data d ON (t.id = d.team)
ORDER BY t.id

Everything works find and my result looks like this: 一切正常,我的结果如下:

+----+------+----+
|name|active|time|
+----+------+----+
|blu |0     |1   |
|blu |0     |5   |
|croc|1     |16  |
|croc|1     |100 |
|foo |1     |2   |
|foo |1     |60  |
+----+------+----+

...but I want that my result looks like this: ...但我希望我的结果如下:

+----+------+---+---+
|name|active|t1 |t2 |
+----+------+---+---+
|blu |0     |1  |5  |
|croc|1     |16 |100|
|foo |1     |2  |60 |
+----+------+---+---+

So... How can I reach this? 那么......我怎么能达到这个目的? I hope I have not overlooked an already asked question... :( 我希望我没有忽略一个已经问过的问题...... :(

Thank you very much! 非常感谢你!

EDIT: First, thank you all, but I forgot something... It is also possible that eg one2 does not exist... 编辑:首先,谢谢大家,但我忘了一些......也有可能是例如one2不存在......

try this 尝试这个

 SELECT t.name, t.active, 
 min(time) t1, max(time)t2
FROM teams t
RIGHT JOIN data d ON (t.id = d.team)
group by name
ORDER BY t.id

DEMO HERE 在这里演示

EDIT: 编辑:

try this 尝试这个

   SELECT t.name, t.active, 
   min(time) t1, if  (  max(time) is not null and max(time) <> min(time) , max(time), null )t2
  FROM teams t
  RIGHT JOIN data d ON (t.id = d.team)
  group by name
  ORDER BY t.id

DEMO HERE 在这里演示

If there cold be at maximum two rows for each team, I would use something like this: 如果每个团队最多有两行冷,我会使用这样的东西:

SELECT
  teams.name,
  teams.active,
  min(d1.time) t1,
  max(d2.time) t2
FROM
  teams INNER JOIN data d1
  ON teams.id=d1.team
  LEFT JOIN data d2
  ON teams.id=d2.team AND d1.time<d2.time
GROUP BY
  teams.name,
  teams.active

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM