【问题标题】:multiple row fetched with max number sql使用最大数量 sql 获取的多行
【发布时间】:2013-05-22 11:19:07
【问题描述】:

我有两张表,记录如下:

客户:

cid | cname | ccountry
-----------------------
  1 | John  | Australia
  2 | Mark  | USA
  3 | Liz   | England

订单:

oid | cid | oquantity
---------------------
  1 |   1 |       100
  2 |   1 |       100
  3 |   2 |        50
  4 |   2 |       150
  5 |   3 |        50
  6 |   3 |       100

我需要找出订单数量最多的客户名称。我运行以下查询并得到了正确的结果。

select cname, ccountry
  from Clients
 where cid in
         (select cid
            from Orders
        group by cid
          having sum(oquantity) = (select max(amount) from
                                       (select sum(oquantity) amount
                                          from Orders
                                        group by cid)t1))

返回 2 行

“约翰”,“澳大利亚”

'马克','美国'

但我只需要知道,是否可以通过更简单的方式完成。一旦还要求退还全部数量,就变得复杂了。

【问题讨论】:

    标签: mysql sql group-by max


    【解决方案1】:

    我已减少您的 2 子查询。

    SELECT
      clients.cid,
      cname,
      ccountry
    FROM Orders,
      Clients
    WHERE orders.cid = clients.cid
    GROUP BY clients.cid
    HAVING SUM(orders.oquantity) = (SELECT
                                      SUM(oquantity) AS amount
                                    FROM Orders
                                    GROUP BY cid
                                    ORDER BY amount DESC
                                    LIMIT 1 )
    

    【讨论】:

      【解决方案2】:
      SELECT c.cname, c.ccountry, SUM(oquantity) AS total_qtty
      FROM Clients c
      INNER JOIN Orders o ON (o.cid = c.cid)
      GROUP BY c.id
      ORDER BY total_qtty DESC
      LIMIT 2
      

      【讨论】:

      • 不需要,仅当您想限制要输出的结果数量时。
      • 但我想获取与 max 匹配的所有记录。在这种情况下,LIMIT 将不起作用。
      • 我的目的是只找出总量等于最大总量的记录。例如,如果您提取订单表,您会发现 cid 1 和 2 的总数为 200,而 cid 3 有 150。因此,需要编写一个仅获取 cid 1 和 2 而不是 3 的查询。
      【解决方案3】:

      试试:

      select cname, ccountry, sum(oquantity)
      FROM Clients c
      INNER JOIN Orders o ON (o.cid = c.cid)
      where c.cid in 
      (
        select cid from Orders group by cid 
         having sum(oquantity) = (
           select max(amount) from (
              select sum(oquantity) amount from Orders group by cid)t1))
      GROUP BY c.cid
      

      【讨论】:

        猜你喜欢
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        相关资源
        最近更新 更多