2009-02-05 8 views
156

मैं दो कॉलम द्वारा MySQL तालिका को कैसे क्रमबद्ध करूं?दो कॉलम द्वारा PHP MySQL ऑर्डर

जो मैं चाहता हूं वह पहले उच्चतम रेटिंग द्वारा क्रमबद्ध लेख हैं, फिर सबसे हाल की तारीख। उदाहरण के लिए, यह एक नमूना उत्पादन होगा

 
50 | This article rocks   | Feb 4, 2009 
35 | This article is pretty good | Feb 1, 2009 
5 | This Article isn't so hot | Jan 25, 2009 

प्रासंगिक एसक्यूएल मैं उपयोग कर रहा हूँ है (बाएं # रेटिंग, तो लेख का शीर्षक है, तो लेख की तारीख है):

ORDER BY article_rating, article_time DESC 

मैं एक या दूसरे से सॉर्ट कर सकता हूं, लेकिन दोनों नहीं।

उत्तर

340

डिफ़ॉल्ट छंटाई आरोही है, तो आप दोनों अपने आदेशों में कीवर्ड DESC जोड़ने की जरूरत:

ORDER BY article_rating DESC, article_time DESC 
+0

विषम। जब मेरे पास दो कॉलम होते हैं, तो नाम और कुल और कुल मिलाकर नाम और डीईएससी द्वारा क्रमबद्ध रूप से क्रमबद्ध करना चाहते हैं, तो मैं केवल देखता हूं कि इसे नाम से आदेश दिया गया था, लेकिन कुल – Eugene

+0

द्वारा नहीं पता था कि यह संभव था! Exxelent! :) – teecee

+0

मैं संख्यात्मक क्षेत्रों पर किसी भी कारण के लिए (-1) * field1, field2 के साथ हैकिंग कर रहा हूं ... धन्यवाद। –

7
ORDER BY article_rating ASC , article_time DESC 

DESC अंत में उतरते दोनों कॉलम से सॉर्ट होगा। आप यदि आप इसे अन्यथा

20
ORDER BY article_rating, article_time DESC 

चाहते तभी एक ही रेटिंग के साथ दो लेख हैं article_time के आधार पर सॉर्ट जाएगा ASC निर्दिष्ट करना होगा। मैं आपके उदाहरण में देख सकता हूं, यह वही होता है जो वास्तव में होता है।

↓ primary sort       secondary sort ↓ 
1. 50 | This article rocks   | Feb 4, 2009 3. 
2. 35 | This article is pretty good | Feb 1, 2009 2. 
3. 5 | This Article isn't so hot | Jan 25, 2009 1. 

लेकिन विचार करें:

↓ primary sort       secondary sort ↓ 
1. 50 | This article rocks   | Feb 2, 2009 3. 
1. 50 | This article rocks, too  | Feb 4, 2009 4. 
2. 35 | This article is pretty good | Feb 1, 2009 2. 
3. 5 | This Article isn't so hot | Jan 25, 2009 1. 
6

यह शायद कोई ऐसा जो रास्ता दो स्तंभों के आधार पर तालिका सॉर्ट करने के लिए की तलाश में है मदद, लेकिन समानांतर तरीके से। इसका मतलब कुल सॉर्टिंग फ़ंक्शन का उपयोग करके दो प्रकारों को गठबंधन करना है। यह बहुत उपयोगी है जब उदाहरण के लिए फुलटेक्स्ट खोज का उपयोग करके आलेखों को पुनर्प्राप्त करना और लेख प्रकाशित करने की तारीख से संबंधित भी।

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

क्षमा करें अगर इस काम को करने के लिए सरल समाधान मौजूद हैं, लेकिन मुझे कोई नहीं मिला है।

SELECT 
`id`, 
`text`, 
`date` 
FROM 
    (
    SELECT 
    k.`id`, 
    k.`text`, 
    k.`date`, 
    k.`match_order_id`, 
    @row := @row + 1 as `date_order_id` 
    FROM 
    (
     SELECT 
     t.`id`, 
     t.`text`, 
     t.`date`, 
     @row := @row + 1 as `match_order_id` 
     FROM 
     (
      SELECT 
      `art_id` AS `id`, 
      `text` AS `text`, 
      `date` AS `date`, 
      MATCH (`text`) AGAINST (:string) AS `match` 
      FROM int_art_fulltext 
      WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE) 
      LIMIT 0,101 
     ) t, 
     (
      SELECT @row := 0 
     ) r 
     ORDER BY `match` DESC 
    ) k, 
    (
     SELECT @row := 0 
    ) l 
    ORDER BY k.`date` DESC 
    ) s 
ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC 
+18

ओह मेरे भगवान आप इस तरह के एक साधारण सवाल के लिए ऐसे कोड क्यों पोस्ट करते हैं। – Andy

2

निम्नलिखित कॉलम क्रम में दोनों कॉलम के आधार पर आपका डेटा ऑर्डर करेगा।

ORDER BY article_rating DESC, article_time DESC