/ / ORDER before GROUPING w połączonych wynikach [duplicate] - mysql, sql

ORDER before GROUPING w połączonych wynikach [duplicate] - mysql, sql

Mam dwie tabele:

  • Tabela użytkowników
  • Tabela "doświadczenia", która zawiera informacje o szkole, do której przechodzi aktualny użytkownik. Ta tabela może zawierać wiele szkół (np. Poprzednią historię szkoły lub nawet zadania)

Chcę pobrać tabelę użytkowników, a następnie pobrać aktualną szkołę (zamawiając przez: exp_date)

Zapytanie wygląda następująco:

SELECT
u.user_id,
u.firstname,
pn.programme_name,
e.exp_start,
en.firstname AS name
FROM
edu_users u
LEFT JOIN edu_experience e ON e.exp_user = u.user_id
LEFT JOIN edu_users en ON en.user_id = e.exp
LEFT JOIN edu_programmes pn ON pn.programme_id = e.exp_position
ORDER BY
exp_start DESC

I zwraca ten wynik:

Pierwszy wynik (od id użytkownika 1) jest tym, czego potrzebuję - dwa poniższe powiązane z identyfikatorem użytkownika 1 nie powinny zostać pobrane.

Jak mogę osiągnąć mój cel? Próbowałem z group by user_id ale wtedy dane są zgrupowane przed zamówieniem, więc wynik wygląda następująco:

Jakieś pomysły? Próbowałem z min () jak opisano w tym pytaniu: ORDER BY data i czas PRZED GROUP BY name w mysql ale to nie działa.

Odpowiedzi:

1 dla odpowiedzi № 1

Połącz się z podselekcją, aby uzyskać najnowsze wrażenia dla każdego użytkownika, a następnie dołącz do niego w oparciu o doświadczenia (i kolejne), aby uzyskać inne szczegóły

Coś takiego

SELECT
u.user_id,
u.firstname,
pn.programme_name,
e.exp_start,
en.firstname AS name
FROM
edu_users u
LEFT JOIN (SELECT exp_user, MAX(exp_start) AS MaxExpStart FROM edu_experience GROUP BY exp_user) e1 ON e1.exp_user = u.user_id
LEFT JOIN edu_experience e ON e.exp_user = u.user_id AND e.exp_start = e1.MaxExpStart
LEFT JOIN edu_users en ON en.user_id = e.exp
LEFT JOIN edu_programmes pn ON pn.programme_id = e.exp_position
ORDER BY
exp_start DESC

0 dla odpowiedzi nr 2

W MySQL musisz użyć pokrewnego podkwerendy, aby uzyskać tylko "najnowszy" rekord dla każdego użytkownika:

SELECT
u.user_id,
u.firstname,
pn.programme_name,
e.exp_start,
en.firstname AS name
FROM
edu_users u
LEFT JOIN edu_experience e ON e.exp_user = u.user_id
LEFT JOIN edu_users en ON en.user_id = e.exp
LEFT JOIN edu_programmes pn ON pn.programme_id = e.exp_position
WHERE e.exp_start = (
SELECT MAX(exp_start) FROM edu_experience z
WHERE z.exp_user = e.exp_user)
ORDER BY
exp_start DESC