我有一个包含以下列的数据库:
-------------------
id|domain|hit_count
-------------------
我想对其执行此查询:
SELECT id,MIN(hit_count)
FROM table WHERE domain='$domain'
GROUP BY domain ORDER BY MIN(hit_count)
我希望此查询为我提供具有最小hit_count的行的 id$domain。唯一的问题是,如果我有两行具有相同的域,比如 www.bestbuy.com,查询将按先到的行分组,然后尽管我会得到正确的最低hit_count,但 id 可能是也可能不是具有最低hit_count的行的 id。
有谁知道我执行此查询并获取与 MIN(hit_count) 匹配的 id 的方法?谢谢!
试试这个:
SELECT id,MIN(hit_count),domain FROM table GROUP BY domain HAVING domain='$domain'
看,当您使用聚合时,无论是通过聚合函数(min()
就是这样的函数)还是通过GROUP BY
或HAVING
运算符,您的数据都会被分组。在您的情况下,它是按域分组的。您的选择列表中有 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');
我使用了反引号,因为table
是SQL中的保留字。
SELECT
id,
hit_count
FROM
table
WHERE
domain='$domain'
AND hit_count = (SELECT MIN(hit_count) FROM table WHERE domain='$domain')
试试这个:
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";
我有同样的问题。请参阅下面的问题。
min(列)没有向我返回其他列的正确数据
您正在使用 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)
如果你想要一个确定性的结果集,你需要告诉软件将什么算法应用于组。例如:
- 最低
- .MAX
- 计数
- 和
等等
最简单的查询方式,只需在 GROUP BY 域之后使用 DESC 关键字对其进行修改即可
SELECT
id,
MIN(hit_count)
FROM table
WHERE domain = '$domain'
GROUP BY domain DESC
ORDER BY MIN(hit_count)
解释:
当您使用带有聚合函数的分组依据时,它始终选择第一条记录,但如果使用 desc 关键字限制它,它将选择该组的最低或最后一条记录。要测试脓体,请使用仅添加group_concat的查询。
SELECT
group_concat(id),
MIN(hit_count)
FROM table
WHERE domain = '$domain'
GROUP BY domain DESC
ORDER BY MIN(hit_count)
如果可以按 id 对重复的域进行分组:
SELECT id,MIN(hit_count)
FROM domain WHERE domain='$domain'
GROUP BY id ORDER BY MIN(hit_count)