【问题标题】:SQL : Using GROUP BY and MAX on multiple columnsSQL:在多列上使用 GROUP BY 和 MAX
【发布时间】:2010-10-28 17:37:31
【问题描述】:

我对 SQL 查询有疑问。让我们以这个示例数据为例

itemID  catID  attrib1  attrib2
  1       1       10       5   
  2       1       10       7
  3       1        5      10
  4       2       18      15

我想为每个类别返回最好的项目(attrib1 优先于 attrib2)

显然,SELECT catID, MAX(attrib1), MAX(attrib2) FROM test_table GROUP BY catID 不起作用,因为它会为第一只猫返回 10 和 10。

那么有没有办法告诉 MySQL 从 attrib2 行中选择最大值,但只考虑 attrib1 也是最大值的那些?即返回以下数据

 catID  attrib1  attrib2
   1       10       7   
   2       18      15

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    您可以获得最佳的 attrib1 值,然后加入 attrib2 值并获得每个 attrib1 值的最佳值:

    select t2.catID, t2.attrib1, max(t2.attrib2)
    from
    (
      select catID, max(attrib1) as attrib1
      from test_table
      group by catID
    ) t1
    inner join test_table t2 on t2.catID = t1.catID and t2.attrib1 = t1.attrib1
    group by t2.catID, t2.attrib1
    

    【讨论】:

    • 感谢所有快速回答的家伙。很高兴也能看到不同的做法。
    • 这行得通吗? 3 个返回值应该是不同行的值。
    • 应该避免这种情况,因为加入会增加很多负载
    【解决方案2】:

    用途:

    SELECT x.catid,
           x.max_attrib1 AS attrib1,
           (SELECT MAX(attrib2)
              FROM YOUR_TABLE y
             WHERE y.catid = x.catid
               AND y.attrib1 = x.max_attrib1) AS attrib2
      FROM (SELECT t.catid,
                   MAX(t.attrib1) AS max_attrib1
              FROM YOUR_TABLE t
          GROUP BY t.catid) x
    

    【讨论】:

      【解决方案3】:
      SELECT tt.catId, tt.attrib1, MAX(tt.attrib2)
      FROM   test_table tt
      GROUP BY tt.catID, tt.attrib1
      WHERE  tt.attrib1 = (SELECT MAX(t2.attrib1) FROM test_table t2 WHERE t2.catID = tt.catID)
      

      【讨论】:

        【解决方案4】:
        SELECT catID, max1, max2 FROM
        ((SELECT Max(attrib1) as max1, catID GROUP BY attrib1) as t1
        INNER JOIN
        (SELECT MAX(attrib2) as max2, catID GROUP BY attrib2) as t2
        ON t1.catID = t2.catID) as t3
        

        【讨论】:

          猜你喜欢
          • 2010-11-20
          • 1970-01-01
          • 2021-02-02
          • 1970-01-01
          • 1970-01-01
          • 2014-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多