【问题标题】:Merging when using SQL GROUP BY使用 SQL GROUP BY 时合并
【发布时间】:2013-04-19 10:13:45
【问题描述】:

我在 mySQL 数据库中的数据看起来像这样(但不仅是这 4 个,我还有很多人出现不止一次,但具有不同的资格和不同的修改日期

选择类似于:

SELECT * FROM table where person_id=1 GROUP BY person_id

所以,如果我做出这个选择并按 person_id 分组,我会得到这样的结果:

有没有可能按人员ID分组,但要说:好的,给我最后修改的资格?通常我在 where SQL 语句中没有person_id
所以我想要我选择的所有人,但只想要最后修改资格的结果
(我希望我解释得很好,以便您了解问题所在)

(我的选择当然比我展示的要复杂得多,这只是为了向你展示我在做什么)

【问题讨论】:

    标签: mysql group-by sql-merge


    【解决方案1】:

    您还可以使用子查询返回每个person_idmax 修改日期,然后将该结果连接到您的表中以获取具有最大日期的行:

    select t1.id, 
      t1.person_id,
      t1.name,
      t1.qualification,
      t1.created,
      t1.modified,
      t1.version
    from yourtable t1
    inner join
    (
      select person_id, max(modified) MaxMod
      from yourtable
      group by person_id
    ) t2
      on t1.person_id = t2.person_d
      and t1.modified = t2.maxmod
    

    【讨论】:

    • 这听起来更像我想要的,我会试一试,谢谢!
    • 看起来它可以工作,但性能完全无法接受,我将进行更简单的 SQL 调用 - 然后在 java 中进行优化。不过还是谢谢@bluefeet
    • @Joerg 你的桌子上有索引吗?
    【解决方案2】:

    如果您想要特定人员的最后修改条目,那么就这样做

    select * from table
    where person_id = 1
    order by modified desc
    limit 1
    

    【讨论】:

      【解决方案3】:

      编辑

      我误解了这个问题,我会更新答案

      试试这个(假设您想要每个人最后修改的资格):

      SELECT 
         person_id,
         qualification
      FROM 
         table as a
      INNER JOIN (
         SELECT 
           person_id,
           MAX(modified) as za_date
         FROM 
           table
         GROUP BY 
           person_id
      ) as tmp 
        ON a.person_id = tmp.person_id
        AND a.modified = tmp.za_date
      

      如果您想要所有人的最后修改资格:

      SELECT
         qualification
      FROM
         table
      WHERE modified = (
             SELECT 
                 MAX(modified)
             FROM
                 table  
         )
      

      【讨论】:

      • 它只是格式化查询以使 WHERE 1 AND cond1 AND cond2 以这种方式更具可读性的标准
      • The main purpose of "WHERE 1" (or "WHERE 1=1") seems to be dynamic filtering。我不建议将它用于所有地方的所有查询。如果没有其他原因,它的可读性并不高,只是需要阅读一段额外的代码,但什么都不做(有些人可能认为你正在尝试做其他事情,但输入错误,或者可能不理解)。
      • 是的,你说得对,如果你没有 AND 条件,就没有使用它的目的,但对我来说,这是习惯的力量 :)
      • 为什么所有这些WHERE 1?他们有目的吗?为什么不加HAVING 1呢?
      • 由于许多投诉,我删除了所有WHERE 1,正如我之前所说的那样,这是一种习惯力量,从我的观点来看,我不应该仅仅因为与其他人的查询写作标准不同而投反对票:)
      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多