MySQL-在单独的表中按值排序
我有两个MySQL表。 表1: 表2: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中的每一行,
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
;