2012-08-24 4 views
7

मैं इसMySQL का चयन क्वेरी के परिणाम के एक अतिरिक्त पंक्ति जोड़ना

id Name count 
1 ABC 1 
2 CDF 3 
3 FGH 4 

की तरह एक MySQL तालिका बस का चयन क्वेरी का उपयोग किया है मैं के रूप में

1 ABC 1 
2 CDF 3 
3 FGH 4 

मैं परिणाम कैसे प्राप्त कर सकते हैं मूल्यों को प्राप्त इस

1 ABC 1 
2 CDF 3 
3 FGH 4 
4 NULL 0 

की तरह आप अंतिम पंक्ति देख सकते हैं। जब रिकॉर्ड्स इस प्रारूप में एक अतिरिक्त पंक्ति समाप्त हो जाती है last_id+1, Null ,0 जोड़ा जाना चाहिए। आप ऊपर देख सकते हैं। यहां तक ​​कि मेरी मूल तालिका में भी ऐसी कोई पंक्ति नहीं है। वहाँ एन पंक्तियों निश्चित नहीं 3,4

+1

आप नहीं कर सकते है। जब तक यह वास्तव में तालिका में मौजूद नहीं है। – hjpotter92

+0

@ नेरड-हर्ड मुझे यकीन नहीं है कि यह सच है। –

+1

@ नेर्ड-हर्ड मुझे यकीन है कि यह सच नहीं है। – GolezTrol

उत्तर

2

यह थोड़ा जटिल लग रहा है हो सकता है, लेकिन यह काम करना चाहिए।

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM 
    (
    SELECT 1 as ID 
    UNION 
    SELECT 2 as ID 
    UNION 
    SELECT 3 as ID 
    UNION 
    SELECT 4 as ID 
    ) a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID IN (1,2,3,4) 

अद्यतन 1

आप बस एक मेज है कि नाम (आईडी) के साथ 1 कॉलम अधिमानतः उत्पन्न कर सकता है हो सकता है ऊपर 10,000 या अधिक रिकॉर्ड किया है। फिर आप बस उस तालिका में शामिल हो सकते हैं जिसमें मूल रिकॉर्ड है। उदाहरण के लिए, संभालने आप एक तालिका 1 स्तंभ के साथ DummyRecord नामित और यह

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM DummyRecord a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID >= 1 AND 
     a.ID <= 4 

यह है कि 10,000 पंक्तियां हैं है। या यदि आप 10 से 100 करने के लिए करना चाहते हैं, तो आप इस हालत इस्तेमाल कर सकते हैं

... 
WHERE a.ID >= 10 AND 
     a.ID <= 100 
+0

तालिका में बहुत सी पंक्तियां हैं जिनमें से केवल एक से 4. हमें गतिशील रूप से – Warrior

+0

@Waririor आह ठीक करने की आवश्यकता है, मुझे यह मिल गया है। मैंने अभी जवाब अपडेट किया है। :) –

0
select 
    x.id, 
    t.name, 
    ifnull(t.count, 0) as count 
from 
    (SELECT 1 AS id 
    -- Part of the query below, you will need to generate dynamically, 
    -- just as you would otherwise need to generate 'in (1,2,3,4)' 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4 
    UNION ALL SELECT 5 
) x 
    LEFT JOIN YourTable t 
    ON t.id = x.id 
0

id तालिका आप से चयन किए जाने वाले में मौजूद नहीं है, तो आप एक के खिलाफ LEFT JOIN करने की आवश्यकता होगी प्रत्येक id की सूची जिसे आप वापस करना चाहते हैं - इस तरह, यह null मानों को उन लोगों के लिए वापस कर देगा जो मौजूद नहीं हैं और जो लोग करते हैं उनके लिए वास्तविक मूल्य।

मैं एक numbers मेज एक भी स्तंभों वाले नंबरों से भरा टेबल है कि बनाने का सुझाव देते हैं: क्या आप सबसे अधिक लगता है

CREATE TABLE `numbers` (
    id int(11) unsigned NOT NULL 
); 

और फिर संख्या की एक बड़ी राशि डालने, 1 से शुरू होकर अप करने के लिए जा रहा id आप कभी भी एक हजार या तो देखेंगे। सुरक्षित पक्ष पर होने के लिए शायद 1 से 1000000 पर जाएं। भले ही, आपको यह सुनिश्चित करने की ज़रूरत है कि यह किसी भी संभावित id को कवर करने के लिए पर्याप्त से अधिक है, जिसमें आप भाग लेंगे।

उसके बाद, आपकी क्वेरी की तरह लग सकता है:

SELECT n.id, a.* 
FROM 
    `numbers` n 
    LEFT JOIN table t 
     ON t.id = n.id 
WHERE n.id IN (1,2,3,4); 

यह समाधान यूनियनों की एक सूची के साथ सब-क्वेरी के लिए आवश्यकता के बिना ids की एक गतिशील बढ़ती सूची के लिए अनुमति देगा; हालांकि, प्रदान किए गए अन्य समाधान समान रूप से एक छोटी ज्ञात सूची के लिए भी काम करेंगे (और गतिशील रूप से उत्पन्न भी हो सकते हैं)।

+0

आपको यह सुनिश्चित करना न भूलना चाहिए कि संख्या तालिका काफी बड़ी है। यह ऐसा कुछ है जिसे आसानी से भुलाया जा सकता है, अगर कोई इसमें 'लगभग दस लाख' रिकॉर्ड डालने का फैसला करता है, और कुछ सालों बाद दूसरी तालिका दस लाख से अधिक हो जाती है। (हाँ, ऐसा होता है!) लेकिन अन्यथा यह मेरे जवाब का एक अच्छा विकल्प है। आपको अभी भी क्वेरी के एक हिस्से को 'उत्पन्न' करने की आवश्यकता है, हालांकि (संख्याओं की सूची), इसलिए यह अधिक आसान नहीं है। – GolezTrol

2

आप mysql ROLLUP का उपयोग करें।

SELECT * FROM your_table 
     GROUP BY Name WITH ROLLUP; 
5

जवाब बहुत सरल

select (select max(id) from mytable)+1 as id, NULL as Name, 0 as count union all select id,Name,count from mytable; 
+0

यह सबसे सटीक उत्तर है जो मैंने पार किया है। – Ronu

संबंधित मुद्दे