2015-05-20 5 views
6

वहाँ दो तरह के परिणाम मैं वापस करना चाहते हैं कम से कम का चयन करने के:SQL क्वेरी के 10 परिणाम

  • अपठित सूचनाएं
  • पढ़ें सूचनाएं

अगर> 10 अपठित सूचनाओं मैं उपलब्ध हैं

यदि < = 10 हैं, तो मैं सभी को चुनना चाहता हूं (कहें 7) अपठित अधिसूचनाएं और 3 'filler' पढ़ना नहीं है tifications। मैं यह कैसे हासिल कर सकता हूं?

अगर मैं सिर्फ सभी अपठित सूचनाओं का चयन करना चाहता था मेरी क्वेरी होगा:

SELECT * FROM notifications WHERE read = 0 

अगर मैं सिर्फ सभी सूचनाएं पढ़ चयन करने के लिए चाहता था मेरी क्वेरी होगा:

SELECT * FROM notifications WHERE read = 1 

उत्तर

5

यह आपको मदद करनी चाहिए: http://sqlfiddle.com/#!9/e7e2a/2

SELECT * FROM 
(
    SELECT @rownum := @rownum + 1 AS rownum, name, read 
    FROM notifications, 
    (SELECT @rownum := 0) r --initialise @rownum to 0 
) t 
WHERE read = 0 OR (read = 1 AND rownum <= 10) 
ORDER BY rownum 

रिकॉर्ड @rownum साथ गिने जा रहे हैं। जहां खंड सुनिश्चित करता है कि पढ़ने = 0 पहले चुने गए हैं। यदि वे 10 या अधिक तक हैं, तो सभी चुने गए हैं। लेकिन यदि नहीं, तो दूसरा मानदंड (read = 1 AND rownum <= 10) चेक किया गया है।

(SELECT @rownum := 0) r@rownum 0 को initialises अन्यथा यह NULL और NULL+1=NULL

enter image description here

+0

क्या आप यहां बता सकते हैं कि क्या हो रहा है थोड़ा? विशेष रूप से आर <= 10 और (चयन @ ड्राउनम: = 0) आर – maxhud

+0

स्पष्टीकरण के लिए धन्यवाद! बहुत बढ़िया जवाब। – maxhud

+0

सभी पंक्तियों को अपठित से पढ़ने के लिए शुरू किया जाता है। अगर अपठित> = 10, तो सभी अपठित चुने गए हैं। यदि अपठित <10, नंबर पढ़ा पंक्तियों में जारी है, लेकिन हम केवल पंक्तियों गिने चाहते <= 10 – codingbiz

5

आप क्या कर सकते हैं संघ दो परिणाम, आदेश से सबसे महत्वपूर्ण है, और उसके बाद की सीमा संघ:

SELECT Col1, Col2, ... 
FROM 
(
    SELECT Col1, Col2, `read`, ... FROM notifications WHERE read = 0 
    UNION 
    SELECT Col1, Col2, `read`, ... FROM notifications WHERE read = 1 
) x 
ORDER BY x.`read` -- And probably a column like Time? 
LIMIT 10; 

SqlFiddle here

संपादित करें, पुन: सभी अपठित, बस पहले नहीं 10

क्षमा याचना लौटना चाहिए, मैं सवाल का वह हिस्सा याद किया। मैं इसे प्राप्त करने के लिए एक शानदार तरीका नहीं सोच सकता, इसलिए यहां एक आंशिक समाधान है जो आवश्यक प्रक्रियाओं के लिए रिसॉर्ट करता है और यदि आवश्यक हो तो पंक्तियों को भरने के लिए एक अस्थायी तालिका: कोडिंगबिज़ के समाधान का उपयोग करें जब तक कि MySQL फ्लाईंग फ़ंक्शंस का समर्थन नहीं करता है (उदाहरण के लिए ROW_NUMBER() OVER (PARTITION BY read ORDER BY Col1 DESC)

+4

नहीं होगा यह केवल वापसी 10 परिणाम अगर वहाँ 15 अपठित सूचनाओं कर रहे हैं? – maxhud

+0

हां, यह बिल्कुल सही नहीं है। अगर ऐसा होता है, तो इसे और अधिक आसानी से लिखा जा सकता है। – Strawberry

+0

हां, दोनों अच्छे अंक - [स्ट्रॉबेरी] (http://sqlfiddle.com/#!9/494df/4) और अभी भी सभी या अधिकतम 10 समस्या पर काम कर रहे हैं। मैं एक गैर जरूरी समाधान नहीं देख सकते हैं लेकिन :( – StuartLC

0

तालिका बड़ा करने के लिए नहीं मिलता है, तो आप उन्हें शामिल होने के रूप में इस प्रकार है

SELECT *, 
    ROW_NUMBER() OVER (
     ORDER BY read 
    ) AS RowNum 
FROM (
    SELECT * FROM notifications WHERE read = 0 
    UNION 
    SELECT * FROM notifications WHERE read = 1 

) T1 
WHERE T1.read = 0 OR (T1.read = 1 AND T1.RowNum <= 10) 
ORDER BY T1.read DESC 

जब इन तालिकाओं बड़ा मिलता है, आप पहली बार 'पढ़ा' मेज पर एक गिनती को चलाने के लिए कोशिश कर सकते हैं और देखते हैं की कोशिश कर सकते यदि इसमें 10 से अधिक अपठित संदेश हैं, और उस परिणाम के आधार पर पढ़ने या अपठित संदेशों का चयन करें

INT @readMessages = SELECT COUNT(*) FROM notifications WHERE read = 0 

SELECT CASE 
    WHEN @readMessages > 10 THEN SELECT * FROM notifications WHERE read = 0 
    ELSE (
     SELECT * FROM notifications WHERE read = 0 
     UNION 
     SELECT * FROM notifications WHERE read = 1 LIMIT 0, [email protected] 
    ) 

पता नहीं है कि यह सभी उचित MySQL वाक्यविन्यास (अधिक एक एसक्यूएल लड़का) है, लेकिन शायद यह आपकी मदद करता है।

+2

MySQL – sqluser

+0

पर कोई 'ROW_NUMBER()' नहीं मिला: http://blog.sqlauthority.com/ 2014/03/08/mysql-generating-row-number-for-each-row-use-variable/ SET \ @row_number: = 0; चुनें *, \ @row_number: = \ @ ROW_NUMBER + 1 ROWNUM से ( चुनें * नोटिफिकेशन से कहां पढ़ = 0 यूनिअन चुनें * नोटिफिकेशन से कहां पढ़ = 1 ) टी 1 कहां T1.read = 0 या (T1.read = 1 और T1.RowNum <= 10) T1.read DESC के लिए क्षमा करें \ @, लेकिन अन्यथा ऐसा लगता है कि मैं उपयोगकर्ता को संदर्भित कर रहा हूं – Rik