2012-07-04 13 views
8

मुझे समझाने के लिए अपेक्षाकृत आसान प्रदर्शन करने की आवश्यकता है, लेकिन (मुझे कुछ सीमित कौशल दिया गया है) एसक्यूएल क्वेरी लिखना मुश्किल है।लगातार मूल्यों को शामिल करने वाली ट्रिकी एसक्यूएल क्वेरी

मान लें कि हम इस एक के समान एक मेज है:

exam_no | name | surname | result | date 
---------+------+---------+--------+------------ 
1  | John | Doe  | PASS | 2012-01-01 
1  | Ryan | Smith | FAIL | 2012-01-02 <-- 
1  | Ann | Evans | PASS | 2012-01-03 
1  | Mary | Lee  | FAIL | 2012-01-04 
...  | ... | ...  | ... | ... 
2  | John | Doe  | FAIL | 2012-02-01 <-- 
2  | Ryan | Smith | FAIL | 2012-02-02 
2  | Ann | Evans | FAIL | 2012-02-03 
2  | Mary | Lee  | PASS | 2012-02-04 
...  | ... | ...  | ... | ... 
3  | John | Doe  | FAIL | 2012-03-01 
3  | Ryan | Smith | FAIL | 2012-03-02 
3  | Ann | Evans | PASS | 2012-03-03 
3  | Mary | Lee  | FAIL | 2012-03-04 <-- 

ध्यान दें कि exam_no और date जरूरी संबंधित नहीं हैं के रूप में एक उदाहरण की तरह मैं चुना से उम्मीद कर सकते हैं।

  • नवीनतम परीक्षा (exam_no = 3) सभी छात्रों को दिया है कि (John Doe, Ryan Smith और Mary Lee) में विफल रहा है लगता है से:

    अब, क्वेरी है कि मैं क्या करने की जरूरत के रूप में निम्नानुसार है।

  • इन छात्रों में से प्रत्येक के लिए निरंतर असफल परीक्षाओं के बैच के पहले दिन की तारीख मिलती है। इसे रखने का एक और तरीका यह होगा: इनमें से प्रत्येक छात्र को अपनी पिछली उत्तीर्ण परीक्षा के बाद आने वाली पहली असफल परीक्षा की तारीख मिलती है। (तालिका में तीरों को देखो)।

जिसके परिणामस्वरूप तालिका कुछ इस तरह होना चाहिए:

name | surname | date_since_failing 
------+---------+-------------------- 
John | Doe  | 2012-02-01 
Ryan | Smith | 2012-01-02 
Mary | Lee  | 2012-03-04 

मैं ऐसे एक प्रश्न कैसे प्रदर्शन कर सकते हैं?

आपके समय के लिए धन्यवाद।

+0

अन्य पाठकों: ध्यान दें कि उन्होंने इसे 'MySQL' –

+0

टैग किया है, लगता है कि आप परिणाम = 'FAIL' पर उसी तालिका में शामिल हो सकते हैं और इसे सबसे अधिक दिनांक वाला चयन करें। आपने क्या प्रयास किया है – Jocke

+0

"नवीनतम परीक्षा *" से आपका क्या मतलब है? परीक्षा जिसमें नवीनतम तारीख है? – eggyal

उत्तर

4

आप इस तथ्य का लाभ ले सकते है कि अगर किसी को सबसे हाल ही में परीक्षा उत्तीर्ण कर ली है, तो वे किसी भी परीक्षा के अपने सबसे हाल ही पास के बाद से विफल रहा है नहीं किया है पैदा करता है: इसलिए समस्या सबसे हाल ही में पास के बाद से विफल रही है पहली परीक्षा पाने के लिए कम कर देता है:

SELECT name, surname, MIN(date) date_since_fail 
FROM  results NATURAL LEFT JOIN (
    SELECT name, surname, MAX(date) lastpass 
    FROM  results 
    WHERE result = 'PASS' 
    GROUP BY name, surname 
) t 
WHERE result = 'FAIL' AND date > IFNULL(lastpass,0) 
GROUP BY name, surname 

sqlfiddle पर यह देखें।

+0

यह बिल्कुल है। मैं विश्वास नहीं कर सकता कि यह समझने के लिए संक्षिप्त और सरल कैसे है। मैं इसे न्यूनतम प्रयास के साथ अपनी वास्तविक समस्या में अनुकूलित करने में कामयाब रहा। बहुत बहुत धन्यवाद। – Gabriel

0

मैं एक सबक्वेरी है कि पिछले परीक्षा उत्तीर्ण कर ली लाने का उपयोग करना चाहिए, somthing की तरह:

SET @query_exam_no = 3; 
SELECT 
name, 
surname, 
MIN(IF(date > last_passed_exam, date, NULL)) AS date_failing_since 
FROM 
exam_results 
LEFT JOIN (
    SELECT 
    name, 
    surname, 
    MAX(date) AS last_passed_exam 
    FROM exam_results 
    WHERE result = 'PASS' 
    GROUP BY name, surname 
) AS last_passed_exams USING (name, surname) 
HAVING 
MAX(IF(exam_no = @query_exam_no, result, NULL)) = 'FAIL' 
GROUP BY name, surname 
0

यह पर्याप्त है:

select t.name, 
     t.surname, 
     t.date as 'date_since_failing' 
from tablename t 
inner join 
(
    select name, 
      surname, 
      max(exam_no) as exam_no 
    from tablename 
    group by name, surname 
    having min(result) = 'FAIL' 
) aux on t.name = aux.name and t.surname = aux.surname and t.exam_no = aux.exam_no 
0

हालत आप के लिए पूछ रहे हैं कुछ भी नहीं आप कर सकते हैं के लिए अच्छा है इसके बिना यहां कामकाजी उदाहरण है।

select 
    e.name, 
    e.sur_name, 
    min(e.date) as `LastFailed` 
from exams as e 
where e.result = 'Fail' 
group by e.name 
    order by e.name 

यह इस परिणाम

name   sur_name LastFailed 
Ann   Evans  2012-02-03 
John  Doe   2012-02-01 
Mary  Lee   2012-01-04 
Ryan  Smith  2012-01-02 
+0

यह परिणाम नहीं है जिसे मैं ढूंढ रहा हूं। तारीखें मेरे प्रश्न में परिणाम तालिका में दिखाई देने वाली होनी चाहिए। जो मैं खोज रहा हूं वह इन छात्रों में से प्रत्येक के लिए निरंतर असफल परीक्षाओं के नवीनतम बैच में पहली असफल परीक्षा की तारीख है। – Gabriel

+0

नहीं, क्षमा करें। जिन परिणामों को मैं ढूंढ रहा हूं वे वही हैं जिन्हें मैंने मूल रूप से मेरे प्रश्न में लिखा था।कृपया अपने परिणामों को फिट करने के लिए मेरे प्रश्न को संपादित न करें, यह वास्तव में अपमानजनक है। – Gabriel

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