2016-07-04 4 views
0

У меня есть две таблицы, одна из которых выглядит следующим образом:MySql запросов с INNER JOIN, GROUP BY и Макс

ID, Datetime, User_ID, Location and Status // the rest is not relevant 

И другой выглядит так:

ID, Lastname // the rest is not relevant 

Теперь я хочу только получите запись первой таблицы с наивысшим Datetime за User_ID и спросите другую таблицу lastname из User_ID. Просто ...

Я пробовал этот способ (Уик выглядит наиболее перспективным, но является ложным nontheless):

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname 
FROM worktimes AS w 
INNER JOIN employees AS e 
ON w.User_ID=e.ID 
RIGHT JOIN (SELECT max(Datetime) AS Datetime, User_ID 
    FROM worktimes 
    WHERE Datetime>1467583200 AND Location='16' 
    GROUP BY User_ID 
    ORDER BY Datetime DESC 
) AS v 
ON v.User_ID=w.User_ID 
GROUP BY w.User_ID 
ORDER BY e.Nachname; 

Может кто-нибудь дать мне подсказку, пожалуйста? Я действительно застрял на этом на некоторое время теперь, и теперь я начинаю получить некоторые узлы в моем мозгу ... :(

+0

как создать небольшой sqlfiddle с некоторыми данными. Покажите таблицу, которую вы ожидаете. И кто-то это выскакивает. – Drew

+0

Подсказка: переключиться с правого соединения, чтобы присоединиться! (У людей обычно достаточно проблем с левым соединением, а правильное соединение - это более запутанное ... Легче думать, что основная таблица слева объединяет необязательные данные, чем необязательные данные. Присоединяйтесь к главной таблице.) – jarlh

+0

смотрите, эти другие ребята гораздо умнее, более грамотным. – Drew

ответ

2

Вы очень близко, на самом деле:

SELECT w.Datetime, w.User_ID, w.Status, e.Lastname 
FROM worktimes w INNER JOIN 
    employees e 
    ON w.User_ID = e.ID LEFT JOIN 
    (SELECT max(Datetime) AS Datetime, User_ID 
     FROM worktimes 
     WHERE Datetime > 1467583200 AND Location = '16' 
     GROUP BY User_ID 
    ) ww 
    ON ww.User_ID = w.User_ID AND w.DateTime = ww.DateTime 
ORDER BY e.Nachname; 

Примечания:

  • Вам нужно зарегистрироваться на значение DateTime.
  • RIGHT JOIN ненужно. Я заменил его LEFT JOIN, но я не уверен, что это то, что вы хотите либо. вы можете начать с INNER JOIN, чтобы увидеть, если го при создании чего вы хотите.
  • Не используйте ORDER BY в подзапросах в большинстве случаев.
  • Вам не нужно GROUP BY во внешнем запросе
+0

Мне нужно ПРАВОЕ СОЕДИНЕНИЕ, потому что таблица слева слишком большая, чтобы использовать левое соединение. Но с ПРАВИЛЬНОЙ ВСТУПЛЕЙ, похоже, хорошо работает ... я провешу еще немного, но спасибо до сих пор. Вы очень помогаете. –

1

То, что вы спрашиваете о известен как correlated subqueries. В стандартном SQL он может быть реализован с использованием конструкций APPLY и LATERAL. К сожалению, не все RDBMS поддерживают эти элегантные решения. Например, MSSQL, последние версии Oracle и Postgresql имеют эти конструкции, но MySQL нет. IMHO, это настоящая боль для пользователей MySQL, потому что в последние годы MySQL начал склоняться к стандарту, но каким-то странным образом - по умолчанию он отключает свои нестандартные хаки, но не реализует стандартные копии. Например, ваш собственный запрос, представленный в вашем вопросе, не будет работать по умолчанию в последних версиях MySQL, потому что сортировка в подзапросах больше не поддерживается, и чтобы она работала, вам нужно использовать некоторые неприятные взломы - добавьте LIMIT some_really_big_number в подзапрос.

+0

Кстати, причина, по которой сортировка может не работать в подзапросах, заключается в том, что в теории отсортированная таблица не является «множеством», а является «курсором».Надеюсь, некоторые мудрые эксперты исправит меня, если я ошибаюсь. – Jacobian