【问题标题】:SELECT MAX from COUNT, other row variables are not correctSELECT MAX from COUNT,其他行变量不正确
【发布时间】:2019-04-08 03:02:15
【问题描述】:

我正在尝试选择按状态对它们进行分组的 COUNT 的最大值(因此,状态中每个不同的值都有一个最大值)。 count 函数按预期工作。

SELECT c.id, c.name, t.name as type, COUNT(*) as count, c.state 
FROM bookings_facilities f 
JOIN bookings b 
ON b.id = f.booking_id 
JOIN clients c 
ON c.id = b.client_id 
JOIN client_types t 
ON c.type = t.id 
WHERE t.name = "School" 
GROUP BY c.id

这是结果,

我使用下面的 SQL 语句尝试选择按状态分组的最大计数。

SELECT *, MAX(z.count) 
FROM (SELECT c.id, c.name, t.name as type, COUNT(*) as count, c.state 
    FROM bookings_facilities f 
    JOIN bookings b 
    ON b.id = f.booking_id 
    JOIN clients c 
    ON c.id = b.client_id 
    JOIN client_types t 
    ON c.type = t.id 
    WHERE t.name = "School" 
    GROUP BY c.id) z
GROUP BY z.state

这是结果,

result 1 中只出现一次的 3 个状态似乎没问题,但对于在第一个结果中出现两次的状态 Selangor 来说,出现了一些问题。

SQL 查询选择了正确的 MAX(Count),即 6,但不是将 id 返回为 1027,而是返回 id 作为 1002,在第一个结果中只有 count 为 1。

我已经尝试过使用不同的数据集,但我似乎无法获得实际 MAX(Count) 行的详细信息。

这里是数据库设计供参考

SQL Fiddle

预期结果是这样,(只需更改第二行输出)。 Current Output Link

【问题讨论】:

  • 这是 nth-row-per-group 问题。如果您在 Stack Overflow 上正确搜索,您可以轻松获得 100 个相同的示例。还有几件事:您的 group by 不是有效的 SQL,在较新版本的 MySQL 中,它会失败。其次,您不需要先对id 进行分组,然后再使用子查询进行第二组。只需通过state进行直接分组即可
  • @MadhurBhaiya 我不知道这个问题叫什么。我现在正在寻找。我尝试使用单个组而不是两个组,但问题是我想根据客户的状态找到客户预订的最多设施。第一个按组计数,第二个按州对它们进行分组。如果我将它们结合起来,我不会得到我想要的结果。
  • 如果您需要帮助,请帮助我们 :) 请提供相关且最少的示例数据,展示您的要求和预期输出。请参阅此链接以了解如何构建一个好的 SQL 问题:Why should I provide an MCVE for what seems to me to be a very simple SQL query?
  • 我已经设置了一个 sql fiddle。我已经用我的预期结果更新了帖子。这里:sqlfiddle.com/#!9/8f68e3
  • 您可以访问 MySQL 8.0 版吗?或者,你能升级吗?旧版本的解决方案将非常冗长。

标签: mysql sql join count max


【解决方案1】:

由于you can use MySQL 8.0,我们可以使用Window Functions解决您的问题。在state 的分区上,我们将确定Row_Number() 具有最高计数的行作为行号1,依此类推。现在,对于特定的state,我们只需要考虑那些行号为 1 的行。

另外,在您的尝试中,GROUP BY 不是有效的 SQL。旧版本的 MySQL 很宽容,允许这样做;但较新的版本不会,除非您关闭严格的only_full_group_by 模式。但是,您不应禁用它,而应修复查询。基本要点是,当使用Group By 时,您的Select 子句应仅包含聚合列/表达式和/或Group By 子句中定义的列/表达式.请阅读:Error related to only_full_group_by when executing a query in MySql

 SELECT dt2.id,
       dt2.NAME,
       dt2.state,
       dt2.type,
       dt2.count
FROM   (SELECT dt1.id,
               dt1.NAME,
               dt1.state,
               dt1.type,
               dt1.count,
               Row_number()
                 OVER (
                   partition BY dt1.state
                   ORDER BY dt1.count DESC) AS row_num
        FROM   (SELECT c.id,
                       c.NAME,
                       c.state,
                       t.NAME   AS type,
                       Count(*) AS count
                FROM   bookings_facilities AS f
                       JOIN bookings AS b
                         ON b.id = f.booking_id
                       JOIN clients AS c
                         ON c.id = b.client_id
                       JOIN client_types AS t
                         ON c.type = t.id
                WHERE  t.NAME = 'School'
                GROUP  BY c.id,
                          c.NAME,
                          c.state,
                          type) AS dt1) AS dt2
WHERE  dt2.row_num = 1  

结果:

| id   | NAME                                     | state     | type   | count |
| ---- | ---------------------------------------- | --------- | ------ | ----- |
| 1006 | Holy Child Montessory School Of Fairview | Manila    | School | 1     |
| 1027 | Sri Kuala Lumpur                         | Selangor  | School | 6     |
| 1010 | Singapore American School                | Singapore | School | 1     |
| 1015 | Keika Junior & Senior High School        | Tokyo     | School | 1     |

View on DB Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2014-12-02
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多