2014-10-04 3 views
1

У меня есть этот запрос:Присоединение Макс Row, где Col

SELECT 
    `shift`.`uid`, 
    `shift`.`activity`, 
    `users`.`fname`, 
    `users`.`lname` 
FROM `shift`, `users` 
WHERE `shift`.`uid` = `users`.`id` 

Это прекрасно работает так же, как это, но мне нужно, чтобы добавить новый столбец из другой таблицы и порядок ею.

times:

| uid | User | time | 
+++++++++++++++++++++ 
| 3 | bob | 1231 | 
| 3 | bob | 1291 | 
| 4 | ned | 1651 | 
| 5 | ted | 5679 | 
| 6 | joe | 7665 | 
| 6 | joe | 7864 | 

Как я могу включать в себя максимальное время из таблицы времени для каждого пользователя, а затем порядка по этому столбцу (где timesuid = shiftuid..)?

Проблема: все остальные таблицы имеют одну строку для каждого пользователя, но таблица времени имеет несколько, и я не могу определить правильную комбинацию соединений и группы.

ответ

2

Вы можете присоединиться на агрегированной запрос:

SELECT `shift`.`uid`, 
     `shift`.`activity`, 
     `users`.`fname`, 
     `users`.`lname` , 
     t.max_time 
FROM  `shift` 
JOIN  `users` ON `shift`.`uid` = `users`.`id` 
JOIN  (SELECT `uid`, MAX(`time`) AS max_time 
      FROM  `times` 
      GROUP BY `uid`) t ON shift.uid = t.uid 
ORDER BY t.max_time 
+0

@rolfl действительно, хороший улов. Добавлен. – Mureinik

+0

Этот был наиболее похож на мой первоначальный запрос. Спасибо, @Mureinik –

1
SELECT s.uid, 
     s.activity, 
     u.fname, 
     u.lname, 
     MAX(t.time) as maxtime 
FROM shift s, 
INNER JOIN users u ON u.id = s.uid 
INNER JOIN times t ON t.uid = u.id 
GROUP BY s.uid, 
     s.activity, 
     u.fname, 
     u.lname 
ORDER BY maxtime 
1

Довольно простой способ приблизиться к этому использует связанный подзапрос:

SELECT s.`uid`, s.`activity`, u.`fname`, u.`lname`, 
     (SELECT MAX(tt.time) 
     FROM timetable tt 
     WHERE tt.uid = u.id 
     ) as maxtime 
FROM `shift` s JOIN 
    `users` u 
    ON s.`uid` = u.`id`; 

Преимущество такого подхода заключается в производительности. С индексом на timetable(uid, time) это должно работать лучше, чем выполнение агрегации на внешнем уровне (потому что запрос будет использовать индекс).

Смежные вопросы