MySQL запрос, чтобы получить данные, упорядоченные по дате, времени и имени (но не хотят разделять общие имена под каждой датой) - PullRequest
2 голосов
/ 27 июля 2011

У меня есть запрос MySQL, который производит этот вывод, упорядоченный так:

current output

Вместо этого я хотел бы, чтобы вывод упорядочился следующим образом: desired output

Я не уверен, как написать запрос, чтобы он упорядочивал данные так, как мне нужно.Мне нужны данные, отсортированные по дате 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

(PS Я не указывал имя станции в моих таблицах вывода, но онидействительно появляются в моем реальном запросе.)

РЕДАКТИРОВАТЬ: Я добавил еще несколько таблиц, чтобы попытаться объяснить проблему лучше.Обратите внимание, что запрос на самом деле не возвращается.Я просто добавил это, чтобы помочь с разговором.У каждого блока есть общая дата.

Вот вывод после того, как я попробовал ORDER BY date DESC, markers.name DESC, время DESC Desired output

И вот мой желаемый вывод:

enter image description here

Сравните «Чанк 4» на двух выходах.Верхняя таблица порядков по названию по убыванию.Это не желательно.Marker_name 'd' содержит новейшую информацию, поэтому я хочу, чтобы она была первой.«С» имеет следующую новейшую информацию.«F» имеет самую старую информацию.Следующая таблица показывает порядок, который мне нужен.

Надеюсь, это лучше прояснит проблему.Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ 2 Я попробовал этот предложенный ответ: "ПОРЯДОК ПО ДАТЕ DESC, времени DESC, markers.name DESC", но это не сработало.

order by date, time, name

Обратите внимание, что фрагмент 3 упорядочен по времени.Строки 'e' и 'b' не сгруппированы вместе.

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Получите список значений MAX(time) для каждой комбинации (markers_id, date) в conditions, затем присоедините этот список к набору строк, который вы получаете из текущего запроса, и используйте значения 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
0 голосов
/ 27 июля 2011

что произойдет, если в вашем запросе в ORDER BY вы добавите DESC для markers.name

... ORDER BY date DESC, markers.name **DESC**, time DESC LIMIT 100?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...