2013-02-22 7 views
10

मैं और निम्न SQL क्वेरी के साथ समस्या यह MySQL आ रहीएसक्यूएल का चयन नहीं में जहां एक ही तालिका क्वेरी से

SELECT 
    id, cpid, label, cpdatetime 
FROM 
    mytable AS a 
WHERE 
    id NOT IN 
    (
    SELECT 
     id 
    FROM 
     mytable AS b 
    WHERE 
     a.label = b.label 
    AND 
     a.cpdatetime > b.cpdatetime 
) 
AND 
    label LIKE 'CB%' 
AND 
    cpid LIKE :cpid 
GROUP BY label 
ORDER BY cpdatetime ASC 

तालिका इस

1 | 170.1 | CB55 | 2013-01-01 00:00:01 
2 | 135.5 | CB55 | 2013-01-01 00:00:02 
3 | 135.6 | CB59 | 2013-01-01 00:00:03 
4 | 135.5 | CM43 | 2013-01-01 00:00:04 
5 | 135.5 | CB46 | 2013-01-01 00:00:05 
6 | 135.7 | CB46 | 2013-01-01 00:00:06 
7 | 170.2 | CB46 | 2013-01-01 00:00:07 

तरह लग रहा है मैं अपने क्वेरी चाहते हैं वापस जाने के लिए

3 | 135.6 | CB59 
5 | 135.5 | CB46 

संपादित

0,123,

लेबल कुत्तों/बिल्लियों और सीपीआईडी ​​कुत्तों/बिल्लियों को रखने वाले अस्थायी परिवार हैं।

कुत्ते/बिल्लियों परिवार से परिवार में जाते हैं।

मैं कुत्तों खोजने की जरूरत है/बिल्लियों जो में थे: परिवार userinput लेकिन केवल तभी जब वे एक और परिवार में नहीं देती थीं,

मैं डेटाबेस परिवर्तन नहीं कर सकते और सिर्फ डेटा के साथ काम करने के रूप में वे कर रहे हैं है और मैं वह नहीं हूं जिसने एप्लिकेशन/डेटाबेस स्कीमा लिखा था।

+0

कोई त्रुटि होती है? – Sir

+3

माफी माँगें - यह उन लोगों की तुलना में एक अच्छी तरह से लिखित प्रश्न है जहां आपके पास thumbscrews का उपयोग करके पुरस्कार जानकारी है। –

+0

क्षमा करें, क्या आप समझा सकते हैं कि इसे पंक्ति 1 क्यों नहीं लौटाया जाना चाहिए? क्या है: सीपीआईडी ​​= '13% '' शायद? –

उत्तर

6

LEFT JOIN का उपयोग करके सहसंबद्ध उप प्रश्नों से बचने की कोशिश:

SELECT a.id, a.cpid, a.label, a.cpdatetime 
FROM mytable AS a 
LEFT JOIN mytable AS b ON a.label = b.label AND a.cpdatetime > b.cpdatetime 
WHERE a.label LIKE 'CB%' AND a.cpid LIKE :cpid 
    AND b.label IS NULL 
GROUP BY a.label 
ORDER BY a.cpdatetime ASC 

Fiddle

तो शामिल होने हालत विफल रहता है, दूसरी तालिका उर्फ ​​के क्षेत्र b हो जाएगा NULL पर सेट करें।

वैकल्पिक रूप से, एक गैर सहसंबद्ध उप क्वेरी का उपयोग करें:

SELECT a.id, a.cpid, a.label, a.cpdatetime 
FROM mytable AS a 
INNER JOIN (
    SELECT label, MIN(cpdatetime) AS cpdatetime 
    FROM mytable 
    WHERE label LIKE 'CB%' 
    GROUP BY label 
) AS b ON a.label = b.label AND a.cpdatetime = b.cpdatetime 
WHERE a.cpid LIKE '135%' 
ORDER BY a.cpdatetime 

सबसे पहले, आप प्रत्येक लेबल के लिए न्यूनतम cpdatetime लगता है और फिर उस में शामिल होने के पहले मेज, जहां आप अतिरिक्त cpid शर्त जोड़ के साथ।

1

मुझे लगता है कि यह वास्तव में आप क्या करना चाहते हैं - प्रत्येक लेबल के लिए सबसे शुरुआती आईडी वाले आईडी का चयन करें, फिर 135 सीपीआईडी ​​और सीबी लेबल वाले रिकॉर्डों में से चुनें।

SELECT 
    A.id, cpid, A.label, cpdatetime 
FROM 
    mytable AS a inner join 
(select id, label from mytable 
    group by label 
    having min(cpdatetime)) as b 
on A.label=B.label and A.id=B.id 
WHERE 
    A.label LIKE 'CB%' 
AND 
    cpid LIKE '135%' 
GROUP BY A.label 
ORDER BY cpdatetime ASC; 

http://sqlfiddle.com/#!2/ccccf/16

+0

'न्यूनतम (cpdatetime) 'हमेशा सही नहीं होगा? –

+0

आपके समाधान और जैक दोनों काम करते हैं लेकिन मुझे यकीन नहीं है कि मुझे स्वीकार्य के रूप में कौन सा चिह्न चिह्नित करना चाहिए। मैं जैक के जवाब को आपके @Joe की तुलना में वास्तव में आसानी से समझता हूं, इसलिए मुझे सच में यकीन नहीं है, अभी भी कुछ और इनपुट पर पढ़ने और MySQL दस्तावेज़ – teuna

+0

एचएम में खोदने की कोशिश कर रहा है, मुझे लगता है कि यह होगा, है ना। MySQL बस मुझे समूह के साथ धोखा दे रहा है और सबसे कम संख्या वाली पंक्ति को वापस कर रहा है, यह अर्थपूर्ण मूल्यांकन करने के बजाय नहीं है ... sigh – Joe

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