2011-10-28 3 views
5

से मैं की तरह टेबल मिल गया है:एसक्यूएल आदेश बयान

table A 
id name email 
1 test1 [email protected] 
2 test2 [email protected] 
3 test3 [email protected] 
4 test4 .... 
5 test5 .... 

table B 
id catA catB year member 
1 false true 2011 2 
2 true false 2011 3 
3 fals true 2010 5 

और मैं मेज एक में हर पंक्ति हो और पालन करते हुए इसे क्रमबद्ध करना चाहते हैं:

FIRST, get user 2 (current year, based on table B) 
SECOND, get user 3 (current year, based on table B) 
after that get users that is in table B 
after that get all other users. 

मुझे पता है कि मैं कर सकता हूँ पहले दो उपयोगकर्ताओं को प्राप्त करने के लिए विशिष्ट एसक्यूएल है, और बस बाकी है। लेकिन क्या मैं उन्हें बयान द्वारा एक अच्छा ऑर्डर के साथ प्राप्त करने में सक्षम नहीं होना चाहिए? पहली पंक्ति कथन को केवल पहली पंक्ति को प्रभावित करने के लिए सीमित करने की तरह ...

+1

अगर आपको अपने प्रश्न का उत्तर मिल गया है, तो कृपया इसे स्वीकार करें। –

उत्तर

4

ऐसा कुछ?

select A.id, A.name, A.email, B.catA, B.catB, B.year 
from A 
join B on A.id = B.member 
ORDER BY B.year DESC, (B.member IS NOT NULL) DESC 

पहले प्रकार तालिका बी में साल क्षेत्र है, जो आप हो जाता है से सभी परिणाम 2011, 2010, आदि ... किसी भी सदस्यों को जो तालिका बी में सूचीबद्ध नहीं हैं एक अशक्त साल और तरह की तह तक होगा सूचि। बीएमम्बर द्वारा अगला प्रकार शून्य नहीं है - mysql इस बुलियन परिणाम को एक पूर्णांक 1 या 0 में जोड़ देगा, जिसे सॉर्ट किया जा सकता है, इसलिए सभी 1 (नल बीमम्बर नहीं) को पहले क्रमबद्ध करने के लिए अवरोही करें।

+0

लगभग इसे मिला: ऑर्डर द्वारा (tableb.year IS NULL) एएससी, (tableb.member शून्य नहीं है) डीईएससी। इसे लगभग सही हो जाता है, समस्या यह है कि मैं पहले बी.catA प्राप्त करना चाहता हूं, फिर B.catB। और यदि यह संभव हो, तो मैं केवल cata और catb में नवीनतम चाहता हूं, उसके बाद ऑर्डर कोई फर्क नहीं पड़ता ... – joxxe

+0

इसे फिक्स्ड: ऑर्डर (CASE tableB.year जब एक्स्ट्राक्ट (अब से वर्ष)) तो 0 ELSE 1 अंत) एएससी, tableA.id desc; – joxxe

0

अपने छँटाई नियमों के आधार पर:

after that get users that is in table B 
after that get all other users. 

मुझे लगता है तालिका एक में कुछ उपयोगकर्ताओं है कि बी में मौजूद नहीं है देखते हैं कि, ताकि आप एक बायाँ शामिल हों का उपयोग करना चाहें।

SELECT a.id, a.name, a.email 
    FROM a 
     LEFT JOIN b 
      ON a.id = b.member 
    ORDER BY ISNULL(b.year), b.year DESC, a.name 
0

तुम हमेशा 'द्वारा आदेश' कर सकते हैं, फिर भी हास्यास्पद रूप से अपने चयन है जटिल, परिणाम से, एक व्युत्पन्न तालिका में डेटा एकत्र तत्वों डाल खरीदने से चयन करके, और आदेश। कुछ की तरह ...

SELECT col1, 
     col2, 
     col3 
    FROM 
     (SELECT 1 as col1, 
       col2, 
       ' ' AS col3 
      FROM blah...blah...blah 
      UNION 
     SELECT 2 AS col1 
       col2, 
       col3 
      FROM blah...blah...blah 
      UNION 
     and so on) myderivedtable 
    ORDER BY col1, 
      col2, 
      col3 

आप केवल आपके प्रश्नों में से प्रत्येक में चयन कर रहे हैं सुनिश्चित करें कि सभी कॉलम बना ही बाहर आते हैं, या अन्यथा एक शून्य मूल्य से निपटने के लिए की है।