如何从MySQL表中获取最新的数据集(每天存储数据集)?

时间:2011-02-06 20:21:28

标签: mysql group-by

我有一个MySQL表,其中包含以下设置:

CREATE TABLE IF NOT EXISTS `coords` (
  `project_id` int(4) NOT NULL,
  `day` tinyint(4) NOT NULL,
  `x` tinyint(4) NOT NULL,
  `y` tinyint(4) NOT NULL,
  `z` tinyint(4) NOT NULL,
  PRIMARY KEY (`tid`,`day`,`x`,`y`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

每个项目都运行了好几天。每天都会对一些案例进行测试,并将结果(坐标集)保存在此表中(以及项目ID和日期编号)。可以比一次更多地保存相同的x和y坐标集(z坐标是实际结果)。

现在,我希望获得具有最新数据的单个项目的所有可用坐标集。

即,假设我有以下数据:

pid | day | x | y | z
  1 |   1 | 2 | 1 | 5
  1 |   1 | 2 | 2 | 6
  1 |   2 | 3 | 3 | 7
  1 |   3 | 2 | 1 | 8
  1 |   3 | 3 | 3 | 9

现在查询将返回:

day | x | y | z
  1 | 2 | 2 | 6
  3 | 2 | 1 | 8
  3 | 3 | 3 | 9

我正在尝试关注查询:

SELECT day, x, y, z 
FROM coords 
WHERE pid = 1 
GROUP BY CONCAT(tid,'.',x,'.',y) 
ORDER BY day DESC

但是这个查询返回旧数据,就像day = 1,x | y | z = 2 | 1 | 5而不是day = 3和x | y | z = 2 | 1 | 8。

有人可以指出我在这里错过的正确方向吗?

提前致谢, 保罗

2 个答案:

答案 0 :(得分:1)

好吧,我在那里遇到问题,因为一旦你做Select * from coords order by day asc limit 1,你就会随机出现。 2.1.5或2.2.6。取决于数据库的感受。根据数据库知道插入这些行的顺序,你肯定需要更具体的“假日”或ID或其他内容。例如,在那里添加一个id字段。

Select distinct day, x,y,z 
FROM coords
where pid = 1
order by id desc

如果你在那里添加id字段

,这可能会有用

答案 1 :(得分:1)

试试这个:)。

SELECT
  day,
  x,
  y,
  z 
FROM
  coords
    JOIN
  (SELECT MAX(tid) AS max_tid FROM coords GROUP BY CONCAT_WS('.', day, x, y)) sub ON (sub.max_tid = coords.tid)
WHERE
  pid = 1