Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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_Greatest N Per Group - Fatal编程技术网

MySQL-在单独的表中按值排序

MySQL-在单独的表中按值排序,mysql,sql,aggregate-functions,greatest-n-per-group,Mysql,Sql,Aggregate Functions,Greatest N Per Group,我有两个MySQL表。 表1: 表2: id otherid time 在每个表中,id是每行的唯一标识符,也是主键 otherid对应于表之间。表2中可能有多行或0行的otherid与表1中的otherid相对应。桌子 比如说,, 表1: 表2: id otherid time 4 326 2014-03-12 023:38:59 5 24 2013-02-11 22:05:21 6 24 2013-02-10 13:27:58 我希望获取表1中的每一行,

我有两个MySQL表。 表1:

表2:

id otherid time
在每个表中,id是每行的唯一标识符,也是主键 otherid对应于表之间。表2中可能有多行或0行的otherid与表1中的otherid相对应。桌子

比如说,, 表1:

表2:

id otherid time
4  326     2014-03-12 023:38:59
5  24      2013-02-11 22:05:21
6  24      2013-02-10 13:27:58
我希望获取表1中的每一行,根据otherid,按表2中与之相关的行的最新时间排序。 在我的例子中,这是我想要的结果:

id name time
2  joe  2014-03-12 023:38:59
1  bob  2013-02-11 22:05:21
这是因为Joe拥有表2中的最新时间。

您可以使用MAX函数获取最新时间

例如,MAXtime

您可以使用MAX函数获取最近时间

例如,MAXtime参见以下示例:

SELECT table1.*, max(table2.time) 
FROM table1 
INNER JOIN table2 ON table1.otherid = table2.otherid
GROUP BY table2.otherid
ORDER BY table2.id
请参见下面的示例:

SELECT table1.*, max(table2.time) 
FROM table1 
INNER JOIN table2 ON table1.otherid = table2.otherid
GROUP BY table2.otherid
ORDER BY table2.id
请参见试一试

工作

试试看


使用

您可以通过连接和子查询来尝试:

select id, name
from tb1 a
left join
(select otherid, max(dt) mdt
from tb2
group by otherid) b
on a.otherid = b.otherid
order by b.mdt desc
;

您可以使用联接和子查询来尝试此操作:

select id, name
from tb1 a
left join
(select otherid, max(dt) mdt
from tb2
group by otherid) b
on a.otherid = b.otherid
order by b.mdt desc
;


我尝试了多个查询,但没有保存它们,但最近:选择table1.id,table1.name,table2.time FROM table2 LEFT JOIN table1上的table1.otherid=table2.otherid按table2.time排序如果table2中没有对应的行,是否需要从table1中提取记录?这不是必需的,否。我尝试了多个查询,但没有保存它们,但最近:选择table1.id,table1.name,table2.time FROM table2 LEFT JOIN table1上的table1.otherid=table2.otherid按table2.time排序如果table2中没有对应行,是否需要从table1中提取记录?这不是必需的,no.id列是多余的。我们必须在此处使用表别名?如果使用内部联接,是否有任何更改?@diEcho如果使用内部联接,您可以使用otherid或将其放在Table1.otherid=Table2.otherid上,但在后一种情况下,您必须根据更改代码的原因指定要分组的表?早期的代码看起来不同,而且interesting@diEcho:自然连接是ANSI,但不建议这样做,因为它为您选择了联接条件-问题是它可能不一致。id列是多余的。我们必须在此处使用表别名?如果使用内部联接,是否有任何更改?@diEcho如果使用内部联接,则可以使用otherid或将其放在表1上。otherid=表2.otherid,但是在后一种情况下,您必须指定一个表来分组为什么更改代码?早期的代码看起来不同,而且interesting@diEcho:NATURAL JOIN是ANSI,但不推荐使用,因为它为您选择了连接条件-问题是它可能不一致。PostgreSQL语法,而不是MySQL PostgreSQL语法,而不是MySQL查看SQL FIDLE,它似乎不按时间排序。然而,将最后一行更改为ORDER BY table2.timing DESC似乎可以做到这一点。让我再做一些测试无顺序依据应该无关紧要,只要您使用MAX函数分组和获取时间值,它将始终检索最大日期时间值,如果您也在寻找基于最大时间的排序,那么是的,您可以使用按时间排序,更新的SQLFIDDLE查看SQL fiddle,时间似乎不太合适。然而,将最后一行更改为ORDER BY table2.timing DESC似乎可以做到这一点。让我再做一些测试。无排序依据应该无关紧要,只要您使用MAX函数分组和获取时间值,它将始终检索最大日期时间值,如果您也在寻找基于最大计时的排序,那么是的,您可以使用ORDER BY time,Update SqlFIDLE
SELECT DISTINCT(table1.id),table1.name,table2.time FROM table1 
LEFT JOIN table2 ON table1.otherid=table2.otherid
ORDER BY table2.time DESC;
SELECT MIN(a.id) AS `id`, MIN(a.name) AS `name`, MAX(b.time) AS `time`
FROM table1 a INNER JOIN
     table2 b ON a.otherid = b.otherid
GROUP BY a.otherid
ORDER BY b.time DESC
select id, name
from tb1 a
left join
(select otherid, max(dt) mdt
from tb2
group by otherid) b
on a.otherid = b.otherid
order by b.mdt desc
;