2015-05-28 9 views
8

पर आधारित SQL रिकॉर्ड्स की गणना करें मेरे पास एक ऐसे स्थान हैं, जिनके पास नाम, स्थान (जहां वे रहते हैं), और parent_id (माता-पिता किसी अन्य तालिका पर संग्रहीत हैं)। उदाहरण के लिए:भाई संपत्ति

name | location | parent_id 
--------+-----------+----------- 
Joe  | Chicago | 12 
Sammy | Chicago | 13 
Bob  | SF  | 13 
Jim  | New York | 13 
Jane | Chicago | 14 
Dave | Portland | 14 
Al  | Chicago | 15 
Monica | Boston | 15 
Debbie | New York | 15 
Bill | Chicago | 16 
Bruce | New York | 16 

मैं कितने लोगों को शिकागो में रहते हैं की गिनती और भाई बहन की आवश्यकता है कि न्यूयॉर्क में रहते हैं (एक PARENT_ID का हिस्सा)। ऊपर के उदाहरण के लिए तो, गिनती 3.

name | location | parent_id 
--------+-----------+----------- 
Joe  | Chicago | 12 
Sammy | Chicago | 13 * sibling Jim lives in New York 
Bob  | SF  | 13 
Jim  | New York | 13 
Jane | Chicago | 14 
Dave | Portland | 14 
Al  | Chicago | 15 * sibling Debbie lives in New York 
Monica | Boston | 15 
Debbie | New York | 15 
Bill | Chicago | 16 * sibling Bruce lives in New York 
Bruce | New York | 16 

किसी की मदद कर सकते हैं मुझे एसक्यूएल इस गणना क्वेरी करने के लिए लिखना होगा?

उत्तर

1

सहसंबंधित क्वेरी जाने का एक बहुत अच्छा तरीका है और यह बहुत ही कुशल है। अलग-अलग उपयोग के रूप में बचें क्योंकि यह एक महंगा ऑपरेशन है। समूह द्वारा अलग के उपयोग पर एक अच्छा विकल्प है। डेटा को समझें और तदनुसार क्वेरी को ढांचा दें। यहां एक और विकल्प है जिसे इंजन अनुकूलित किया गया है ...

select count(*) 
from (select * from #t where Location = 'Chicago') ch 
inner join (select * from #t where Location = 'New York') ny on ch.ParentID = ny.ParentID 
+0

वे एक सहसंबंधित सबक्वायरी नहीं हैं, वे केवल उप-सामान हैं, और आपका उत्तर उसी समस्या से पीड़ित है जो पीडी 1ce की शुरुआत में किया गया था; यह न्यू यॉर्क एन टाइम्स में एन भाई बहनों के साथ शिकागो में लोगों की गिनती करने जा रहा है। – Uueerdo

1

शायद इसे आजमाएं?

SELECT Count(*) 
FROM table table1 
WHERE table1.location= 'Chicago' 
     AND EXISTS (SELECT * FROM table table2 
        WHERE table1.parent_id= table2.parent_id 
          AND table2.location= 'New York') 
3

ऐसा लगता है कि मिन्ह का उत्तर बहुत अच्छा काम करता है, लेकिन यहां एक सेल्फ जॉइन का उपयोग करके एक और उदाहरण है।

SELECT Count(DISTINCT a.child_id) 
FROM people a 
    JOIN people b ON a.parent_id = b.parent_id 
WHERE a.location = 'Chicago' AND b.location = 'New York' 

सूचीबद्ध उपरोक्त तालिका के लिए "3" का उत्पादन करना चाहिए।

संपादित करें: लिथिस के सुझाव के आधार पर एक DISTINCT a.parent_id जोड़ा गया।

EDIT2: जैसा कि यूएरडो द्वारा देखा गया है, एक बच्चा_आईडी या कुछ प्रकार की अनूठी आईडी वास्तव में शिकागो में रहने वाले दो भाई बहनों और न्यूयॉर्क में रहने वाले 1 भाई के मामले में मदद करेगी। मैंने इसे प्रतिबिंबित करने के लिए मूल क्वेरी संपादित की है।

चूंकि यह वास्तव में आपके प्रश्न का "उत्तर" नहीं है, क्योंकि ऐसा कोई बच्चा नहीं है, इसलिए मैं यूएरडो के जवाब को रोक दूंगा, क्षमा करें!

+0

मैंने क्वेरी नहीं चलाई है, लेकिन ऐसा लगता है कि अगर न्यूयॉर्क में दो अलग-अलग भाई बहन हैं तो यह एक व्यक्ति को दो बार गिना जाएगा। शायद 'GROUP BY a.id' जोड़ना या 'COUNT (DISTINCT a.id)' का उपयोग करना इसे रोक देगा। – Lithis

+0

आप सही लिथिस हैं, उसे पकड़ नहीं लिया। मैं अपनी पोस्ट संपादित करूंगा। – PD1ce

+0

आपको वास्तव में "बाल आईडी" की आवश्यकता है, यदि शिकागो में दो लोगों के समान माता-पिता हैं, तो उन्हें केवल एक बार गिना जाएगा। दरअसल, 'COUNT (DISTINCT ए। *) 'शायद काम करेगा? – Uueerdo

1
SELECT COUNT(*) 
FROM `people` AS p1 
WHERE p1.`location` = 'Chicago' 
     AND p1.parent_id IN (
     SELECT DISTINCT parent_id 
     FROM `people` AS p2 
     WHERE p2.`location` = 'New York' 
     ) 
; 

मिन्ह के आधार के रूप में उपयोग करना, यह बहुत तेज़ होना चाहिए; चूंकि सबक्वायरी अब "सहसंबंधित" नहीं है, इसलिए इसे people में प्रत्येक पंक्ति के लिए बार-बार निष्पादित करने की संभावना को जोखिम नहीं लेना चाहिए।

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