2

我有一个数据集:

+----+---------------+-------+-------------+---------------------+
| id | ip            | port  | point_count | create_time         |
+----+---------------+-------+-------------+---------------------+
|  1 | 192.168.20.28 | 10000 |           0 | 2013-03-29 14:29:14 |
|  2 | 0.0.0.0       | 10000 |           0 | 2013-03-29 14:29:32 |
|  3 | 0.0.0.1       | 11111 |           2 | 2013-03-29 14:29:38 |
|  4 | 0.0.0.5       | 11112 |           3 | 2013-03-29 14:29:44 |
+----+---------------+-------+-------------+---------------------+
4 rows in set (0.00 sec)

现在,我使用mysql的MIN()函数来获取记录:

mysql> SELECT s.id, s.ip, s.port, MIN(s.point_count) FROM origin_server s;
+----+---------------+-------+--------------------+
| id | ip            | port  | MIN(s.point_count) |
+----+---------------+-------+--------------------+
|  1 | 192.168.20.28 | 10000 |                  0 |
+----+---------------+-------+--------------------+
1 row in set (0.00 sec)

显然,列 point_count 有两行具有相同的值,但它只返回了一条记录。我只是想确认这种情况是否正确。提前致谢 :)

4

4 回答 4

5

您只获得一条记录的原因是因为MIN()它是一个聚合函数,它为每个组返回一条记录。由于您没有指定GROUP BY子句,因此结果是正常的,它只给您一条记录。

您可以使用子查询来获取 的最小值point_count并将其等同于外部查询的 point_count.

SELECT  *
FROM    origin_server 
WHERE   point_count = (SELECT MIN(point_count) FROM origin_server)

输出

╔════╦═══════════════╦═══════╦═════════════╦═════════════════════╗
║ ID ║      IP       ║ PORT  ║ POINT_COUNT ║     CREATE_TIME     ║
╠════╬═══════════════╬═══════╬═════════════╬═════════════════════╣
║  1 ║ 192.168.20.28 ║ 10000 ║           0 ║ 2013-03-29 14:29:14 ║
║  2 ║ 0.0.0.0       ║ 10000 ║           0 ║ 2013-03-29 14:29:32 ║
╚════╩═══════════════╩═══════╩═════════════╩═════════════════════╝
于 2013-04-01T02:48:06.840 回答
2

是的,只返回一条记录是正确的:返回的其他值是“不明确的”,不能可靠地视为聚合的一部分!

如果使用聚合函数,则它有效地将整个查询视为一个组(除非任何其他定义的分组)。为了获得明确定义的行为,选择列表中的所有列都必须是聚合的,或者必须在 GROUP BY 子句中提及。

使用SELECT s.ip, MIN(s.point_count) FROM origin_server s GROUP by s.ip将返回 4 条记录(每个组MIN都应用),因为它定义了不同的分组。

UsingSELECT MIN(s.point_count) FROM origin_server s将仅返回最小 point_count(在整个查询中),这在逻辑上是正确的,并且是原始查询中唯一可以保证的信息。当这样查看时,只返回一条记录是有道理的。

于 2013-04-01T02:53:45.010 回答
1

很难知道你想要什么,但试试这个:

select
   ip,
   port,
   min(point_count)
from origin_server

这为您提供了 ip 和端口的每个唯一组合的 point_count 的最小值。

如果您想要具有最小 point_count 的 ip 和端口,请尝试以下操作:

select
   ip,
   port,
   point_count
from origin_server
order by 3
limit 1
于 2013-04-01T02:59:40.527 回答
0

MIN() 函数是一个聚合函数。所以如果你的代码只返回 1 行结果是正确的

于 2013-04-01T02:55:47.470 回答