2017-07-28 42 views
0

在MySQL最高值选择行,我想选择一个行对每个“foreign_id”。它必须是列“时间”(DATETIME类型)中具有最高值的行。你能帮我看看SQL SELECT语句的外观吗?谢谢! 这真的太棒了!我已经想了好几个小时寻找解决办法:(与一列在SQL

这是我的表:

primary_id | foreign_id | name | time 
---------------------------------------------------- 
1   | 3   | a | 2017-05-18 01:02:03 
2   | 3   | b | 2017-05-19 01:02:03 
3   | 3   | c | 2017-05-20 01:02:03 
4   | 5   | d | 2017-07-18 01:02:03 
5   | 5   | e | 2017-07-20 01:02:03 
6   | 5   | f | 2017-07-18 01:02:03 

这是结果应该是什么样子:

我试图订购按时间(降序),然后使用限制1.只选择第一行,但这样我不能让每一行对应一个foreign_id中间结果。

另一次尝试,是先订购中中间结果按时间(降序),然后是GROUP BY foreign_id。但GROUP BY语句似乎之前的ORDER BY语句(I接收的primary_id 1和4中的行作为一个结果,而不是图3和5)被执行。

回答

0

试试这个

SELECT DISTINCT * 
From my_table A 
INNER JOIN (SELECT foreign_id, Max(time) AS time FROM my_table GROUP BY foreign_id) B 
ON A.foreign_id = B.foreign_id AND A.time = B.time 
+0

如果表中有与相同的时间戳相同的外键的多行,这个查询将返回所有这些条目。 – dasblinkenlight

+0

我不认为'DISTINCT'是必要的,因为表格上有一个PK,所以所有的行都是不同的。另外,@dasblinkenlight说。 – Blorgbeard

+0

谢谢,这工作正常:)在我的情况下时间戳不能相同,他们之间总是有多个分钟 – user3624130

0

只需添加一些数据样本来分析特例

CREATE TABLE Table1 
    (`primary_id` int, `foreign_id` int, `name` varchar(1), `time` datetime) 
; 

INSERT INTO Table1 
    (`primary_id`, `foreign_id`, `name`, `time`) 
VALUES 
    (1, 3, 'a', '2017-05-18 01:02:03'), 
    (2, 3, 'b', '2017-05-19 01:02:03'), 
    (3, 3, 'c', '2017-05-20 01:02:03'), 
(7, 3, 'H', '2017-05-20 01:02:03'), 
    (4, 5, 'd', '2017-07-18 01:02:03'), 
    (5, 5, 'e', '2017-07-20 01:02:03'), 
    (6, 5, 'f', '2017-07-18 01:02:03') 
; 

http://sqlfiddle.com/#!9/38947b/6

select d.primary_id, d.foreign_id, c.name, d.time 
from table1 c inner join ( 
select max(b.primary_id) primary_id, a.foreign_id, a.time 
from table1 b inner join 
(select foreign_id, max(time) time 
from table1 
group by foreign_id) a 
on a.foreign_id = b.foreign_id and a.time=b.time 
group by a.foreign_id, a.time ) d 
on c.primary_id=d.primary_id 
0

在用你走了将编码这是一个相关子查询日: SELECT * FROM 表1Ø WHERE primary_id =( SELECT分钟(m.primary_id)FROM表1米 WHERE m.time =( SELECT MAX(i.time)FROM表1我 WHERE o.foreign_id = i.foreign_id ) )

额外的子查询处理重复的情况下foreign_id &时间值。如果您确定每个foreign_id的时间都是唯一的,您可以省略中间子查询。