2013-07-23 9 views
5

नीचे मेरी तालिका सबसे उपयुक्त है। मुझे यह जानने की ज़रूरत है कि छात्र आईडी (स्टूडियो) के आधार पर कौन से छात्र प्रीपोस्ट कॉलम में नामित प्री और पोस्ट टेस्ट ले चुके हैं। तो नीचे दी गई सरल तालिका के आधार पर मुझे 123456 स्टडी वापस करने की आवश्यकता होगी। मैं इसके लिए SELECT क्वेरी कैसे लिखूं?MYSQL - एकाधिक पंक्तियों, समान उपयोगकर्ता, अलग-अलग मानों से चुनें

SQL query: SELECT studid, prepost FROM `fittest` LIMIT 0, 30 ; 

    studid prepost 
    123456 pre 
    123456 post 
    1031460 pre 
+0

क्या आप अब तक की कोशिश की? हमें अपनी क्वेरी दिखाएं और हमें बताएं कि आपको समस्या का सामना करना पड़ रहा है। –

उत्तर

3

SELECT studid 
    FROM fittest 
GROUP BY studid 
HAVING COUNT(DISTINCT prepost) = 2 
प्रयास करें

या यदि आप सुनिश्चित करना चाहते हैं कि केवल आईडी pre साथ ठीक एक पंक्ति और post साथ एक पंक्ति है तो आप इसे इस

SELECT studid 
    FROM fittest 
GROUP BY studid 
HAVING (MAX(prepost = 'pre') + 
     MAX(prepost = 'post')) = 2 
    AND COUNT(DISTINCT prepost) = 2 

आउटपुट की तरह लागू कर सकते हैं:

 
| STUDID | 
---------- 
| 123456 | 

यहाँ SQLFiddle डेमो है दोनों प्रश्नों के लिए

+0

** [संभावित बग] (http://sqlfiddle.com/#!2/f73d0/1) ** – Luv

+0

@Luv: ओपी के पास केवल पूर्व और पोस्ट के रूप में ही विकल्प है। –

+0

@Luv मुझे विश्वास है कि ओपी में वास्तविक जीवन में केवल 'पूर्व' और 'पोस्ट' मान हैं। लेकिन मैंने एक प्रश्न जोड़ा है जो पूर्व और पोस्ट के अलावा अन्य मूल्यों के साथ पंक्तियों की संभावनाओं को समाप्त करता है। – peterm

-1

करें .... जहां में studid (123456,123457, ...)

+0

क्या ????????????? –

+0

'स्टडीड' पर आधारित स्टडीड, प्रीस्टोस्ट से 'फिस्टेस्ट' में अध्ययन करें (123456,123457, ...) – frag

+0

** ओपी क्या पूछ रहा है ** –

0

कोशिश:

select f1.studid 
     from fittest f1 
     inner join fittest f2 
     on f1.studid = f2.studid 
    where f1.prepost = 'pre' and f2.prepost = 'post' 
यहाँ

है SQL Fiddle

+1

यह कभी भी आउटपुट –

+0

@downvoter नहीं देगा: गलत क्वेरी डाउनवोट के लिए नहीं है। .. ** कृपया ** –

+0

मेरा अपडेट जांचें। –

0

अपनी वास्तविक प्राथमिक कुंजी के आधार पर, आप निम्न का उपयोग करते हैं:

SELECT studid 
FROM fittest 
WHERE prepost = 'pre' OR prepost = 'post' 
GROUP BY studid 
HAVING COUNT(DISTINCT prepost) = 2 
0
SELECT t1.studid 
FROM fittest t1 
INNER JOIN t2 ON t1.studid=t2.studid 
WHERE t1.prepost = 'pre' 
AND t2.prepost='post' 
+1

हालांकि आप सही हैं लेकिन जुड़ने के बजाय, मुझे लगता है कि अलग विकल्प त्वरित है ... –

+0

मैं आपसे सहमत हूं। पेट्रोम का जवाब अधिक प्रदर्शनकारी लगता है। मैंने सूचना के उद्देश्य के लिए अपना जवाब छोड़ा, लेकिन यह निश्चित रूप से सबसे अच्छा नहीं है। –

0

केवल पहले और बाद के इस स्तंभ में संभव हो रहे हैं तो अतिरिक्त रिकॉर्ड के साथ

SELECT studid FROM fittest group by studid 
HAVING Min(prepost)<>max(prepost) 
0
SELECT 
studid 
FROM `fittest` 
where prepost = 'pre' 
or prepost = 'post' 
group by studid 
having count(distinct prepost)=2 

SQL Fiddle प्रयास करें।

+0

मुझे नहीं लगता कि इसमें कोई आउटपुट होगा ... 'जहां prepost =' pre ' और prepost =' post'' हर बार विफल हो जाएगा क्योंकि यह संभव नहीं है ... –

+0

@ फ़ैहिम पार्कर मुझे इंगित करने के लिए धन्यवाद बग। अभी जांचें। – Luv

+0

** [यहां आपकी क्वेरी में बग है] (http://sqlfiddle.com/#!2/a18e3/1) ** – peterm

0

आप इस्तेमाल कर सकते हैं JOIN

SELECT a.studid 
FROM fittest a 
JOIN fittest b 
    ON a.studid=b.studid 
     and a.prepost like 'pre' 
     and b.prepost like 'post' 
4

के बारे में क्या एक में शामिल हों:

select s1.studid, s1.prepost, s2.prepost 
from fittest s1 
inner join fittest s2 
    on s1.studid = s2.studid 
where s1.prepost = 'pre' 
    and s2.prepost = 'post' 
संबंधित मुद्दे