2013-11-28 3 views
2

Начнем с того, что я почти выполнил свой запрос MySQL, но мне просто нужен окончательный намек на ответ.Выберите наименьшую дату после группы по

Я использовал следующий MySQL запрос (для справки):

SELECT * FROM 
(
    SELECT ll.id AS id, ll.globalId AS globalId, ll.date AS date, ll.serverId AS serverId, ll.gamemodeId AS gamemodeId, ll.mapId AS mapId, origin, 
    pjl.id AS pjlid, pjl.globalid AS pjlglobalId, pjl.date AS pjldate, MIN(pjl.date) AS mindate, pjl.serverId AS pjlserverId, pjl.playerId AS pjlplayerId 
    FROM (
      (
       SELECT id, globalId, date, serverId, playerId, 'playerjoins' AS origin 
       FROM playerjoins pj 
       WHERE playerId =976 
      ) 
     UNION ALL 
      (
       SELECT id, globalId, date, serverId, playerId, 'playerleaves' AS origin 
       FROM playerleaves pl 
       WHERE playerId =976 
      ) 
     ORDER BY date DESC 
    )pjl 
    JOIN levelsloaded ll ON pjl.date >= ll.date 
    GROUP BY ll.id, origin 
ORDER BY date DESC) above 

Это дало мне ResultSet (часть его), который можно найти на следующих SQL Fiddle: http://sqlfiddle.com/#!2/514b6/1/0

Я хочу следующее:

  • Теперь вы видите, что есть повторяющиеся id «s в результирующем, возьмите для примера привести с id = 133.
  • Я хочу увидеть первое действие, которое произошло после даты в этой записи (id = 113).
  • Дата такой записи: November, 27 2013 00:00:17+0000.
  • Теперь возможны две возможные действия, произошедшие непосредственно после этой даты:
  • 1) origin = 'playerjoins'mindate = November, 28 2013 00:00:18+0000.
  • 2) origin = 'playerleaves'mindate = November, 28 2013 00:00:19+0000.
  • С тех пор, как playerjoins - это тот, который впервые произошел, я хочу, чтобы это было в моем конечном наборе результатов.

Итак, я надеюсь, что в моем примере ясно, что для каждых 2 строк с одним и тем же идентификатором я хочу иметь строку, которая имеет самый низкий mindate. Мне нужно уметь видеть целый ряд, так что зная самое низкое mindate за 2 строки, не хватает. Мне также нужно знать origin.

EDIT: Ответ можно найти здесь, https://stackoverflow.com/a/7745635/2057294, все еще исследуя его.

ответ

0

Правильный запрос:

SELECT * 
FROM levelsloaded ll 
INNER JOIN 
    (SELECT id, MIN(mindate) AS finalmindate 
    FROM levelsloaded 
    GROUP BY id 
) ill 
ON ll.id = ill.id AND ll.mindate = ill.finalmindate 
ORDER BY date DESC 

Это именно то, что я описал, более подробный ответ можно найти в: https://stackoverflow.com/a/7745635/2057294.

Смежные вопросы