Mysql 连接最大行,其中列
我有一个疑问:Mysql 连接最大行,其中列,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我有一个疑问: SELECT `shift`.`uid`, `shift`.`activity`, `users`.`fname`, `users`.`lname` FROM `shift`, `users` WHERE `shift`.`uid` = `users`.`id` 它可以像那样正常工作,但我需要从另一个表中添加一个新列并按它排序 次: | uid | User | time | +++++++++++++++++++++ | 3 |
SELECT
`shift`.`uid`,
`shift`.`activity`,
`users`.`fname`,
`users`.`lname`
FROM `shift`, `users`
WHERE `shift`.`uid` = `users`.`id`
它可以像那样正常工作,但我需要从另一个表中添加一个新列并按它排序
次
:
| uid | User | time |
+++++++++++++++++++++
| 3 | bob | 1231 |
| 3 | bob | 1291 |
| 4 | ned | 1651 |
| 5 | ted | 5679 |
| 6 | joe | 7665 |
| 6 | joe | 7864 |
如何从时间表中为每个用户包括最长时间(其中时间uid
=移位uid
),然后按该列排序
问题是,所有其他表每个用户都有一行,但时间表有多行,我无法确定联接和分组方式的正确组合。您可以在聚合查询上联接:
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
您可以在聚合查询上加入:
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
一种非常简单的方法是使用相关子查询:
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`;
这种方法的优点是性能。如果在时间表(uid,time)
上有一个索引,这应该比在外部级别进行聚合更好(因为查询将利用索引)。一个非常简单的方法是使用相关子查询:
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`;
这种方法的优点是性能。如果在时间表(uid,time)
上有一个索引,这应该比在外部级别进行聚合更好(因为查询将利用该索引)。@rolfl确实很好。这是最像我最初的查询。谢谢@Mureinik@rolfl的确,接球不错。这是最像我最初的查询。谢谢,@Mureinik