2013-03-10 12 views
15

मेरे पास स्ट्रीम के लिए अगली निर्धारित आइटम को पकड़ने के लिए निम्न चयन कथन है। यदि कोई मिलान पंक्ति नहीं है, तो मैं इसे डिफ़ॉल्ट मान वापस करना चाहता हूं। यहाँ लाइन मैं उपयोग कर रहा हूँ है:कोई पंक्ति नहीं मिली है यदि कोई पंक्ति नहीं मिली

SELECT `file` FROM `show`, `schedule` 
    WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
    AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
    ORDER BY `start_time` DESC LIMIT 1 

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

SELECT COALESCE(`file`, 'default.webm') FROM `show`, `schedule`... 

और::

SELECT IFNULL(`file`, 'default.webm') FROM `show`, `schedule` 

हालांकि, यह हमेशा एक खाली परिणाम देता है अगर कोई भी पंक्ति पाए जाते हैं मैं निम्नलिखित की कोशिश की है। मैं इसके बजाय डिफ़ॉल्ट मान कैसे वापस कर सकता हूं?

उत्तर

20

एक तरह से यह

SELECT IFNULL(MIN(`file`), 'default.webm') `file` 
    FROM `show`, `schedule` 
WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
    AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
ORDER BY `start_time` DESC LIMIT 1 

जब से तुम केवल एक पंक्ति लौटने के लिए, आप एक समग्र समारोह का उपयोग कर सकते है कि मामले MIN(), कि यह सुनिश्चित करता है कि आप NULL मिलेगा अगर कोई रिकॉर्ड चयनित में, क्या करना है। फिर IFNULL() या COALESCE() अपना काम करेगा।

+1

शानदार सामग्री! लेकिन इस अवधारणा को एक प्रश्न पर कैसे लागू किया जा सकता है जो हमारे मामले में एक के बजाय कई पंक्तियां देता है? – Vectoria

+0

यह वास्तव में एक अच्छा समाधान नहीं है क्योंकि टॉमस नीचे बताता है (संभवतः यदि आप प्राथमिक कुंजी मान पर पूछते हैं)। – Pierre

0

विभिन्न प्रकार के मामलों को संभालने के लिए, आपको कुछ सशर्त तर्क की आवश्यकता होगी।

if exists (
     SELECT `file` FROM `show`, `schedule` 
     WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
     AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
) then 
     SELECT `file` FROM `show`, `schedule` 
     WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
     AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
     ORDER BY `start_time` DESC LIMIT 1 
; else 
     select `DefaultValue` as `file` 
; end if 
7

मामलों में जहां परिणामों की केवल एक पंक्ति की उम्मीद है के लिए, बस हार्डकोडेड मूल्य के साथ UNION का उपयोग करें (: तो तुम एक प्रक्रिया में इस कोड को लपेट और यह कॉल करने के लिए की आवश्यकता होगी यह MySQL में संग्रहित प्रक्रियाओं में ही उपलब्ध है एस) एक दूसरे SELECT खंड में जिसमें मूल चयन के रूप में कॉलम की संख्या समान है।

ओपी के लिए:

(SELECT `file` FROM `show`, `schedule` 
    WHERE `channel` = 1 AND `start_time` <= UNIX_TIMESTAMP() 
    AND `start_time` > UNIX_TIMESTAMP()-1800 AND `show`.`id` = `schedule`.`file` 
    ORDER BY `start_time` DESC LIMIT 1) UNION (SELECT 'default.webm') LIMIT 1; 

किसी भी वाक्यविन्यास त्रुटियों वर्जित, परिणाम सेट एक स्तंभ file कहा जाता है के साथ एक पंक्ति तक प्रस्तुत कर देगा।


एक अधिक सामान्य उदाहरण के रूप में:

(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234') 
UNION (SELECT 'Def Val','none','') LIMIT 1; 

या तो मामले में:

  • कोई भी पंक्ति पहले चयन में पाया नहीं हैं, तो परिणाम सेट से भर दिया जाएगा दूसरे चयन से मूल्य।

  • यदि पहली पंक्ति में एक पंक्ति पाई जाती है, तो पहले सेट मान परिणाम सेट में पेश किए जाते हैं और दूसरे चयन मान छोड़े जाते हैं।

* आप दूसरे का चयन करें मूल्यों के लिए एक स्तंभ नाम/उर्फ ​​आवंटित करने के लिए आप एक ही कॉलम पहले चयन से (एक ही क्रम में) उपयोग करना चाहते हैं नहीं है।

* यूनियन को दो संयुक्त प्रश्नों के कॉलम नामों की समानता की आवश्यकता नहीं है, वास्तव में आप दूसरे केस क्वेरी में अलग-अलग कॉलम नाम असाइन कर सकते हैं यदि यह आपके मामले में मदद करता है। (आपके परिणाम सेट प्रोसेसिंग कोड को इन कॉलम नामकरण मतभेदों के लिए समायोजित करने की आवश्यकता होगी।)

(SELECT Col1,Col2,Col3 FROM ExampleTable WHERE ID='1234') 
UNION (SELECT 'Def Val' AS `Fallback1`,'none' AS `Fallback2`,'' AS `Fallback3`) LIMIT 1; 

मेरी राय यह है कि यह पढ़ना बहुत आसान है और कर लगाने की क्वेरी की तरह प्रतीत नहीं होता है।

+0

यह मेरे लिए बहुत अच्छी तरह से काम करता है। मुझे एक अनुमान के साथ एक कुल ('MAX') करने की आवश्यकता थी और यदि भविष्यवाणी से मेल खाने वाली कोई पंक्ति नहीं थी, तो मुझे कोई पंक्ति वापस नहीं मिलेगी। अब मुझे इसके बजाय डिफ़ॉल्ट वापस मिल गया है। – Rob

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