問題:在存在值之間爲服務器獲取第一個空閒端口。如果沒有空閒的地方,則取最高+ 1.MySQL之間存在的第一個空閒數值
額外:如果server_deleted = 1,那麼我們可以採用空閒端口。當價值之間存在差距時,我們也應該採取自由港。我們應該在where子句中包含server_type。最小值是第一個端口,例如現在9000
我的查詢如下:
SELECT server_port + 1
FROM pro_servers s
WHERE s.server_port <> 0
AND s.server_type = 'ts3'
AND s.server_deleted = 0
AND NOT EXISTS
(SELECT s1.server_port
FROM pro_servers s1
WHERE s1.server_port <> 0
AND s1.server_type = 'ts3'
AND s1.server_port = s.server_port + 1
AND s1.server_deleted = 0
)
ORDER BY server_port LIMIT 1
我認爲有更好的方式來做到這一點。此查詢執行速度非常慢。
例如first = minimum = lowest = 9000,接下來是9002,9003.我們需要獲得9001.如果我們添加9001,那麼得到9004.第一個值9000存在於表中。
樣本數據
+-----------+-------------+----------------+-------------+
| server_id | server_port | server_deleted | server_type |
+-----------+-------------+----------------+-------------+
| 151 | 9500 | 1 | teamspeak3 |
| 8459 | 9500 | 0 | teamspeak3 |
| 183 | 9501 | 1 | teamspeak3 |
| 264 | 9502 | 1 | teamspeak3 |
| 4155 | 9502 | 1 | teamspeak3 |
| 2707 | 9503 | 1 | teamspeak3 |
| 4160 | 9503 | 1 | teamspeak3 |
| 154 | 9504 | 1 | teamspeak3 |
| 4163 | 9504 | 1 | teamspeak3 |
| 285 | 9506 | 1 | teamspeak3 |
| 4167 | 9506 | 1 | teamspeak3 |
| 8454 | 9506 | 0 | teamspeak3 |
| 241 | 9507 | 1 | teamspeak3 |
| 4169 | 9507 | 1 | teamspeak3 |
| 188 | 9509 | 1 | teamspeak3 |
| 4177 | 9509 | 1 | teamspeak3 |
+-----------+-------------+----------------+-------------+
查詢結果:9501當我們使用這個端口,然後下一個:9502,9503,9504,9505,9507,9508,9509,9510等
EXPLAIN計劃?你有索引嗎? – 2013-03-13 21:15:39
第一個數字:=最小數字:=最小數字? – wildplasser 2013-03-13 21:16:57
請發佈數據樣本和預期的查詢結果。 – 2013-03-13 21:25:08