2013-04-28 7 views
0

Я искал различные вопросы, но не нашел ответа. У меня есть MySQL таблицы 'команды':MySQL - Объедините строки в один

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

и таблицы 'данные':

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

В 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 и мой результат выглядит следующим образом:

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

... но я хочу, чтобы мой результат выглядит следующим образом:

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

Итак ... Как я могу достичь этого? Я надеюсь, что я не упускать из виду уже задаваемый вопрос ... :(

Большое спасибо

EDIT: Во-первых, спасибо всем, но я что-то забыл ... Это также возможно, что, например, One2 не существует ...

+2

вы не знаете. вы хотите, что в принципе сводная таблица, которую mysql не поддерживает. Сделайте это преобразование в своем коде клиента. Это ** МОЖЕТ быть ** написано в sql, но оно становится ОЧЕНЬ уродливым, ОЧЕНЬ быстрым. –

+0

[Основы оснований таблиц: строки в столбцы] (http://www.artfulsoftware.com/infotree/qrytip.php?id=78), хотя мне бы пришлось согласиться с @MarcB: это может стать беспорядочным! –

ответ

2

попробовать этот

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:

попробовать это

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

+0

Обратите внимание, что это работает, только если есть ровно 2 записи времени ... –

+0

Ой ... Я что-то забыл. Также возможно, что, например, «one2» не существует ... – user2329363

+0

он уже упомянул две записи в своих желаемых результатах 't1' и' t2', если у него три, он должен упомянуть также 't3' –

0

Если холодный быть не более двух строк для каждой команды, я хотел бы использовать что-то вроде этого:

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 
Смежные вопросы