0

我有两张桌子:

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

我希望获取用户表,然后还获取当前学校(通过排序:ex​​p_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但它不起作用。

4

2 回答 2

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
于 2013-10-03T13:48:01.767 回答
0

On MySQL you need to use a related subquery, to only get the "latest" record for each user:

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
于 2013-10-03T13:19:38.880 回答