我有这个问题:
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 times
。uid
= shift
。uid
)添加时间表中的最长时间,然后按该列排序?
麻烦的是,所有其他表每个用户只有一行,但时间表有多个,我无法找出连接和分组的正确组合。
答案 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)
上的索引,这应该比在外层执行聚合更好(因为查询将利用索引)。