2

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

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

4

7 回答 7

1

试试这个:

SELECT id,MIN(hit_count),domain FROM table GROUP BY domain HAVING domain='$domain'
于 2012-06-22T05:13:32.440 回答
1

看,当您使用聚合时,无论是通过聚合函数(并且min()是这样的函数)还是通过GROUP BYorHAVING运算符,您的数据都会被分组。在您的情况下,它按域分组。您的选择列表中有 2 个字段,id并且min(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');

我使用了反引号,就像tableSQL 中的保留字一样。

于 2012-06-22T05:29:30.323 回答
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";
于 2012-06-22T05:11:53.267 回答
0
SELECT 
    id, 
    hit_count
FROM 
    table
WHERE 
    domain='$domain'
    AND hit_count = (SELECT MIN(hit_count) FROM table WHERE domain='$domain')
于 2012-06-22T05:13:38.250 回答
0

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

min(column) 没有返回其他列的正确数据

您正在使用 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. 数数

等等等等

于 2012-06-22T05:33:16.323 回答
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 与聚合函数一起使用时,它总是选择第一条记录,但如果您使用 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) 
于 2012-06-22T07:13:42.743 回答
0

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

SELECT id,MIN(hit_count)
FROM domain WHERE domain='$domain'
GROUP BY id ORDER BY MIN(hit_count)
于 2012-06-22T22:50:24.420 回答