我有一个 MySQL 查询,它生成的输出顺序如下:
相反,我希望输出顺序如下:
我不确定如何编写查询以便它按照我需要的方式对数据进行排序。我需要按日期 DESC 排序的数据,然后按时间 DESC 排序的数据,而且还要将常见的“markers_name”元素组合在一起。 (我只希望每个日期都将它们组合在一起)。
这是我正在使用的查询:
SELECT markers.name AS markers_name,
conditions.time AS conditions_time,
conditions.date AS conditions_date,
station.name AS station_name
FROM markers, conditions, users
WHERE conditions.markers_id = markers.id
AND (conditions.station_id = station.id)
ORDER BY date DESC, markers.name, time DESC
LIMIT 100
(附:我省略了在输出表中显示 station_name,但它们确实显示在我的真实查询中。)
编辑: 我添加了更多表格以试图更好地解释问题。 请注意,“ block ”并不是真正由查询返回的。我只是添加了它以帮助对话。每个 block 都有一个共同的日期。
这是我尝试 ORDER BY date DESC , markers.name DESC , time DESC 后的输出
这是我想要的输出:
比较两个输出中的“Chunk 4”。上表按名称降序排列。这是不希望的。 Marker_name 'd' 有最新的信息,所以我希望它是第一个。 “C”有下一个最新信息。 'f' 具有最旧的信息。下表显示了我需要的顺序。
希望这能更好地传达问题。谁能帮忙?
编辑 2 我尝试了这个建议的答案:“ORDER BY date DESC, time DESC, markers.name DESC”但它没有用。
请注意, block 3 按时间排序。 “e”行和“b”行未组合在一起。
最佳答案
获取 conditions
中 (markers_id, date)
的每个组合的 MAX(time)
值列表,然后将该列表加入到您从当前查询中获取的行集,并使用 MAX(time)
值进行排序:
SELECT
m.name AS markers_name,
c.time AS conditions_time,
c.date AS conditions_date,
s.name AS station_name
FROM markers m
INNER JOIN conditions c ON c.markers_id = m.id
INNER JOIN station s ON c.station_id = s.id
INNER JOIN (
SELECT
markers_id,
date,
MAX(time) AS time
FROM conditions
GROUP BY
markers_id,
date
) mx ON c.markers_id = mx.markers_id AND c.date = mx.date
ORDER BY
c.date DESC,
mx.time DESC,
m.name DESC,
c.time DESC
关于mysql 查询以获取按日期、时间和名称排序的数据(但不想在每个日期下拆分通用名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6845487/