【问题标题】:mysql ORDER BY MIN() not matching up with idmysql ORDER BY MIN() 与 id 不匹配
【发布时间】:2012-06-24 09:53:46
【问题描述】:

我有一个包含以下列的数据库:

-------------------
id|domain|hit_count
-------------------

我想对其执行此查询:

SELECT id,MIN(hit_count)
  FROM table WHERE domain='$domain'
 GROUP BY domain ORDER BY MIN(hit_count)

我希望这个查询给我 $domain 的 hit_count 最小的行的 id。唯一的问题是,如果我有两行具有相同的域,比如 www.bestbuy.com,查询将按先出现的那一个进行分组,然后虽然我会得到正确的最低 hit_count,但 id 可能会或可能会不是具有最低 hit_count 的行的 id。

有谁知道我执行此查询并获得与 MIN(hit_count) 匹配的 id 的方法吗?谢谢!

【问题讨论】:

  • 不要使用table 作为表名。 table 是 MYSQL 中的保留关键字
  • 谢谢。我只是把它作为例子而不是我的真实表名。不过很高兴知道。

标签: mysql sql-order-by min


【解决方案1】:

试试这个:

SELECT id,MIN(hit_count),domain FROM table GROUP BY domain HAVING domain='$domain'

【讨论】:

  • 这需要解释一下。除非我遗漏了什么,否则它也会忘记提问者想要的 ORDER BY。
【解决方案2】:

请看,当您使用聚合时,无论是通过聚合函数(min() 就是这样一个函数)还是通过 GROUP BYHAVING 运算符,您的数据都会被分组。在您的情况下,它按域分组。您的选择列表中有 2 个字段,idmin(hit_count)

现在,对于每个组,数据库都知道要选择哪个hit_count,因为您已经通过聚合函数明确指定了这一点。但是id 呢?应该包括哪一个? MySQL 在内部将这些字段包装到 max() 聚合函数中,我发现这是一种容易出错的方法。在所有其他 RDBMS 中,您收到此类查询的错误。

规则是:如果你使用聚合,那么所有列应该是聚合函数的参数或者GROUP BY操作符的参数。

要达到想要的结果,你需要一个子查询:

SELECT id, domain, hit_count
  FROM `table`
 WHERE domain = '$domain'
   AND hit_count = (SELECT min(hit_count) FROM `table` WHERE domain = '$domain');

我使用了反引号,因为table 是 SQL 中的保留字。

【讨论】:

    【解决方案3】:
    SELECT 
        id, 
        hit_count
    FROM 
        table
    WHERE 
        domain='$domain'
        AND hit_count = (SELECT MIN(hit_count) FROM table WHERE domain='$domain')
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT id,hit_count
        FROM table WHERE domain='$domain'
       GROUP BY domain ORDER BY hit_count ASC;
      

      这也应该有效:

      select id, MIN(hit_count) from table where domain="$domain";
      

      【讨论】:

      • 您只需要特定域的最小命中数的行 ID。对!
      • 选择多个字段时如何使用没有GROUP BY子句的聚合函数?
      • 为什么我们不能在没有 GROUP BY 的情况下使用聚合函数??而 srchulo 只想要特定域数量最少的行的 ID。谢谢
      • 您不只选择 id。您正在选择 id 和 min(hit_count)
      • 是的,我同时选择了 id 和 min(hit_count)。这不是问题。如果我得到该行,我也可以从该行中选择 *(all)。
      【解决方案5】:

      我也有同样的问题。请参阅下面的问题。

      min(column) is not returning me correct data of other columns

      您正在使用 GROPU BY。这意味着结果中的每一行代表一个 值。 其中一个值是组名(分组依据的字段的值)。其余的是该组中的任意值。
      例如下表:

      F1   |   F2
      1         aa
      1         bb
      1         cc
      2         gg
      2         hh
      

      如果你要按 F1 分组:SELECT F1,F2 from T GROUP BY F1 你会得到两行:

      1    and one value from (aa,bb,cc)
      2    and one value from (gg,hh)
      

      如果您想要一个确定性的结果集,您需要告诉软件将什么算法应用于该组。比如几个:

      1. 分钟
      2. 最大
      3. 计数
      4. 总和

      等等等等

      【讨论】:

        【解决方案6】:

        有一种最简单的方法可以让您的查询正常,只需在 GROUP BY 域之后使用 DESC 关键字修改它

        SELECT
          id,
          MIN(hit_count)
        FROM table
        WHERE domain = '$domain'
        GROUP BY domain DESC
        ORDER BY MIN(hit_count) 
        

        说明:
        当您将 group by 与聚合函数一起使用时,它总是选择第一条记录,但如果您使用 desc 关键字限制它,它将选择该组的最低或最后一条记录。 要测试 puspose,请使用仅添加了 group_concat 的查询。

        SELECT
          group_concat(id),
          MIN(hit_count)
        FROM table
        WHERE domain = '$domain'
        GROUP BY domain DESC
        ORDER BY MIN(hit_count) 
        

        【讨论】:

          【解决方案7】:

          如果您可以按 id 分组重复域:

          SELECT id,MIN(hit_count)
          FROM domain WHERE domain='$domain'
          GROUP BY id ORDER BY MIN(hit_count)
          

          【讨论】:

            猜你喜欢
            • 2015-02-26
            • 2013-07-07
            • 2010-09-30
            • 1970-01-01
            • 2012-04-05
            • 2023-02-21
            • 2012-04-12
            • 1970-01-01
            • 2014-01-09
            相关资源
            最近更新 更多