/ / ORDER antes de GROUPING nos resultados juntos [duplicate] - mysql, sql

ORDER antes de GROUPING nos resultados juntos [duplicate] - mysql, sql

Eu tenho duas mesas:

  • A tabela do usuário
  • A tabela "experiência", que contém informações sobre a qual escola o usuário atual vai. Esta tabela pode conter várias escolas (ou seja, histórico escolar anterior ou até empregos)

Desejo buscar a tabela de usuários e, em seguida, também buscar a escola atual (encomendando por: exp_date)

A consulta é assim:

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

E isso retorna este resultado:

O primeiro resultado (do ID do usuário 1) é o que eu preciso - os dois abaixo associados ao user_id 1 não devem ser buscados.

Como eu alcanço meu objetivo? Eu tentei com group by user_id mas os dados são agrupados antes de serem ordenados, então o resultado é assim:

Alguma ideia? Eu tentei com min (), conforme descrito nesta pergunta: ORDER BY data e hora ANTES DE AGRUPAR POR nome no mysql mas não funciona.

Respostas:

1 para resposta № 1

Associe-se a uma subseleção para obter a experiência mais recente de cada usuário e junte-a de volta à experiência (e adiante) para obter os outros detalhes

Algo assim

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 para resposta № 2

No MySQL você precisa usar uma subconsulta relacionada, para obter apenas o registro "mais recente" para cada usuário:

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