2012-09-07 11 views
24

से लापता आईडी मैं MySQL में इस तालिका है उदाहरण के लिए, मिलती है:MySQL तालिका

ID | Name 
1 | Bob 
4 | Adam 
6 | Someguy 

अगर आप देखते हैं, वहाँ कोई आईडी नंबर है (2, 3 और 5)।

मैं एक प्रश्न कैसे लिख सकता हूं ताकि MySQL केवल इस मामले में अनुपलब्ध आईडी का उत्तर दे सके: "2,3,5"?

उत्तर

14

एक अधिक कुशल क्वेरी:

SELECT (t1.id + 1) as gap_starts_at, 
     (SELECT MIN(t3.id) -1 FROM my_table t3 WHERE t3.id > t1.id) as gap_ends_at 
FROM my_table t1 
WHERE NOT EXISTS (SELECT t2.id FROM my_table t2 WHERE t2.id = t1.id + 1) 
HAVING gap_ends_at IS NOT NULL 
+0

धन्यवाद इवान पर बहुत धीमी गति से। यह बहुत तेज़ चलता है! – MikeC

+0

यह मेरे लिए काम करता है, सिवाय इसके कि यह आईडी = 1 – egprentice

2

प्रश्नों ताकि आप यह कोशिश एक एकल स्तंभ में लापता संख्या प्राप्त करने के लिए कर सकते हैं दो कॉलम दे देंगे से ऊपर

select start from 
(SELECT a.id+1 AS start, MIN(b.id) - 1 AS end 
    FROM sequence AS a, sequence AS b 
    WHERE a.id < b.id 
    GROUP BY a.id 
    HAVING start < MIN(b.id)) b 
UNION 
select c.end from (SELECT a.id+1 AS start, MIN(b.id) - 1 AS end 
    FROM sequence AS a, sequence AS b 
    WHERE a.id < b.id 
    GROUP BY a.id 
    HAVING start < MIN(b.id)) c order by start; 
+0

से शुरू होने वाले प्रारंभिक अंतर को याद करता है, इस एक कॉलम संस्करण के साथ, मुझे (उदाहरण के लिए) '475',' 477', '506',' 508', '513 'लेकिन दो कॉलम संस्करण के साथ, मुझे '[475,475]', '[477,506]', '[508,513]' मिलता है, जो मुझे बताता है कि मुझे संख्या 475, 477-506, और 508-513 गुम है। –

1

इवान के जवाब में थोड़ा जोड़ने के लिए, वें संस्करण शो संख्या शुरुआत में याद आ रही है, तो 1 मौजूद नहीं है:

SELECT 1 as gap_starts_at, 
     (SELECT MIN(t4.id) -1 FROM testtable t4 WHERE t4.id > 1) as gap_ends_at 
FROM testtable t5 
WHERE NOT EXISTS (SELECT t6.id FROM testtable t6 WHERE t6.id = 1) 
HAVING gap_ends_at IS NOT NULL limit 1 
UNION 
SELECT (t1.id + 1) as gap_starts_at, 
     (SELECT MIN(t3.id) -1 FROM testtable t3 WHERE t3.id > t1.id) as gap_ends_at 
FROM testtable t1 
WHERE NOT EXISTS (SELECT t2.id FROM testtable t2 WHERE t2.id = t1.id + 1) 
HAVING gap_ends_at IS NOT NULL;