SELECT data.sPort
FROM
((SELECT (s.server_port + 1) sPort
FROM pro_servers s
LEFT JOIN pro_servers sp1 ON sp1.server_port = s.server_port + 1
WHERE (sp1.server_port IS NULL)
ORDER BY sPort)
UNION ALL
(SELECT s.server_port sPost
FROM pro_servers s
GROUP BY s.server_port
HAVING COUNT(s.server_port) = SUM(s.server_deleted)
ORDER BY sPort)) AS data
ORDER BY data.sPort
LIMIT 1
SqlFiddle:http://sqlfiddle.com/#!2/12ab1/2
यह कैसे काम करता है
-
बाएं जुड़ें
pro_servers
pro_servers
. के साथserver_port = server_port + 1
. के साथ शर्त में शामिल हों और पंक्तियाँ लें, जहाँnull
है अगले . में बंदरगाह। ये पंक्तियाँ हर गैप से पहले पोर्ट दिखाती हैं। पोर्ट आईडी कोserver_port + 1
. के रूप में लिया जा सकता है । -
सभी हटाए गए पोर्ट लें।
-
संघ 1. और 2.,
server_port
द्वारा आदेश दें और पहला ले लो।
उत्तर के लिए एक धारणा है - सबसे कम संख्या वाला पोर्ट हमेशा लिया जाता है। यदि यह सत्य नहीं है, तो उस पोर्ट को अलग से जांचें (या कोई अन्य UNION ALL
जोड़ें) क्वेरी के लिए)।