在联接结果中的GROUPING之前订购

时间:2013-10-03 13:15:44

标签: mysql sql

我有两张桌子:

  • 用户表
  • “体验”表,其中包含有关当前用户所在的学校的信息。该表可以包含多个学校(即以前的学校历史,甚至是工作)

我希望获取users表,然后获取当前学校(通过命令:exp_date)

查询如下所示:

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

它返回此结果:

第一个结果(来自用户ID 1)是我需要的 - 下面的两个与user_id 1相关联的结果不应该被提取。

我如何实现这个目标?我尝试使用group by user_id,但数据在排序之前已经分组,因此结果如下所示:

有什么想法吗?我已尝试使用此问题中描述的min():ORDER BY date and time BEFORE GROUP BY name in mysql但它不起作用。

2 个答案:

答案 0 :(得分:1)

加入一个子选择以获得每个用户的最新体验,然后加入该体验(以及之后的体验)以获取其他详细信息

像这样的东西

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

答案 1 :(得分:0)

在MySQL上,你需要使用一个相关的子查询,只为每个用户获取“最新”记录:

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