mysql ORDER BY MIN()与id不匹配

时间:2012-06-22 05:02:12

标签: mysql sql-order-by min

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

-------------------
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的方法?谢谢!

7 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:1)

当您使用聚合时,通过聚合函数(以及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中的保留字。

答案 2 :(得分:0)

试试这个:

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";

答案 3 :(得分:0)

SELECT 
    id, 
    hit_count
FROM 
    table
WHERE 
    domain='$domain'
    AND hit_count = (SELECT MIN(hit_count) FROM table WHERE domain='$domain')

答案 4 :(得分:0)

我有同样的问题。请在下面看到这个问题。

<强> 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. MIN
  2. MAX
  3. COUNT
  4. SUM
  5. 等等

答案 5 :(得分:0)

您的查询有一种最简单的方式,只需在GROUP BY域

之后使用DESC关键字进行修改即可
SELECT
  id,
  MIN(hit_count)
FROM table
WHERE domain = '$domain'
GROUP BY domain DESC
ORDER BY MIN(hit_count) 

说明:
当您使用group by with aggregate function时,它总是选择第一条记录,但如果使用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) 

答案 6 :(得分:0)

如果您可以按ID包含重复的域组:

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