Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接最大行,其中列_Mysql_Sql_Aggregate Functions - Fatal编程技术网

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