【问题标题】:ORDER before GROUPING in joined results [duplicate]在合并结果中分组前排序 [重复]
【发布时间】:2013-10-03 13:15:44
【问题描述】:

我有两张桌子:

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

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

【问题讨论】:

  • 查看上面链接的相关问题。我想你会想使用 MAX(exp_start) 而不是 MIN。
  • 谢谢 - 我已经尝试了 MAX 与 MIN 相同的结果。

标签: mysql sql


【解决方案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

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

    • 您好 - 问题是它只获取 1 个带有上述查询的结果。
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多