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 に同じ値を持つ 2 つの行がありますが、1 つのレコードしか返されませんでした。この状況が正しいかどうかを確認したいだけです。前もって感謝します :)

4

4 に答える 4

5

レコードが 1 つしか取得されない理由MIN()は、グループごとに 1 つのレコードを返す集計関数であるためです。GROUP BY句を指定していないため、結果は正常で、1 つのレコードのみが得られます。

サブクエリを使用して の最小値を取得し、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

はい、正しいのは 1 つのレコードのみが返されることです。返される他の値は「不適切な定義」であり、集約の一部として確実に表示することはできません!

集計関数が使用されている場合、クエリ全体が 1 つのグループとして効果的に扱われます(他の定義されたグループ化は除外されます)。明確に定義された動作を取得するには、選択リスト内のすべての列が集計であるか、GROUP BY 句で指定する必要があります。

を使用すると、別のグループ化が定義されるためSELECT s.ip, MIN(s.point_count) FROM origin_server s GROUP by s.ip、4 つのレコードが返されます ( がグループごとMINに適用されます)。

を使用SELECT 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 に答える