加入Max Row,Col

时间:2014-10-04 16:47:06

标签: mysql sql aggregate-functions

我有这个问题:

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 | 

如何为每个用户(WHERE timesuid = shiftuid)添加时间表中的最长时间,然后按该列排序?

麻烦的是,所有其他表每个用户只有一行,但时间表有多个,我无法找出连接和分组的正确组合。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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)上的索引,这应该比在外层执行聚合更好(因为查询将利用索引)。