即使2条记录具有相同的时间戳,也可获得最新条目

时间:2014-02-10 09:52:27

标签: mysql sql

我使用下面的代码来检索所有用户的最新数据。但是如果用户在同一时间戳上添加了点数,那么我想得到最后一个条目,而不是像下面的例子中那样。我怎么做即使2条记录具有相同的时间戳,也要确保我获得最新的条目。

http://sqlfiddle.com/#!2/374db/1

我非常感谢任何帮助。谢谢你。

CREATE TABLE if not exists tblA
(
id int(11) NOT NULL auto_increment ,
sender varchar(255),
receiver varchar(255),
 msg varchar(255),
 date timestamp,
  points varchar(255),
  refno varchar(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblB
(
id int(11) NOT NULL auto_increment ,
sno varchar(255),
name varchar(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
data varchar(255),
  refno varchar(255),
  extrarefno varchar(255),
 PRIMARY KEY (id)
);


INSERT INTO tblA (sender, receiver,msg,date,points,refno ) VALUES
('1', '2', 'buzz ...','2011-08-21 14:11:09','10','001'),
('1', '2', 'test ...','2011-08-21 14:12:19','20','002'),
('4', '2', 'test ...','2011-08-21 14:13:19','30','003'),
('1', '3', 'buzz ...','2011-08-21 14:11:09','10','004'),
('1', '3', 'test ...','2011-08-21 14:12:19','20','005'),
('1', '4', 'buzz ...','2011-08-21 14:11:09','10','006'),
('1', '4', 'test ...','2011-08-21 14:12:19','20','007'),
('3', '4', 'test ...','2011-08-21 14:13:19','20','008'),
('2', '4', 'test ...','2011-08-21 14:13:19','20','009');



INSERT INTO tblB (sno, name ) VALUES
('1', 'Aa'),
('2', 'Bb'),
('3', 'Cc'),
('4', 'Dd'),
('5', 'Ee'),
('6', 'Ff'),
('7', 'Gg'),
('8', 'Hh');


INSERT INTO tblC (data,refno,extrarefno ) VALUES
('data1', '001', '101'),
('data2', '002', '102'),
('data3', '003', '103'),
('data4', '004', '101'),
('data5', '005', '102'),
('data6', '006', '103'),
('data7', '007', '101'),
('data8', '008', '101'),
('data9', '009', '101');

/// 查询:

SELECT *
FROM (

  SELECT tblB.*, MAX(tblA.date) AS date
  FROM tblB
  JOIN tblA ON tblB.sno = tblA.receiver
  GROUP BY tblB.sno

) AS subset
JOIN tblA ON subset.sno = tblA.receiver 
            AND subset.date = tblA.date JOIN tblC ON tblA.refno=tblC.refno 

2 个答案:

答案 0 :(得分:1)

关键的想法是使用id列而不是date列。它是自动递增的,因此最大的id应该是更新的。

但是,您的查询还有另一个问题,即子查询中与tblB的连接。来自tblB的任意(“不确定”)值将在外部查询中返回。相反,只需汇总tblA并将join移至tblB到外层:

SELECT *
FROM (SELECT tblA.receiver, MAX(tblA.id) AS id
      FROM tblA
      GROUP BY  tblA.receiver
    ) subset JOIN
    tblA
    ON subset.receiver = tblA.receiver AND subset.id = tblA.id JOIN
    tblB
    on tblA.receiver = tblB.sno join
    tblC
    ON tblA.refno=tblC.refno ;

答案 1 :(得分:0)

按日期和ID排序。 id设置为自动递增,如果日期相同,则可以假设在。之后创建了更高的id。

ORDER BY date, id