สั่งซื้อตาราง MySQL สองคอลัมน์


228

ฉันจะเรียงลำดับตาราง MySQL ด้วยสองคอลัมน์ได้อย่างไร

สิ่งที่ฉันต้องการคือบทความที่เรียงลำดับตามอันดับสูงสุดก่อนจากนั้นจึงเป็นวันที่ล่าสุด ตัวอย่างเช่นนี่จะเป็นผลลัพธ์ตัวอย่าง (เหลือ # คืออันดับจากนั้นชื่อบทความจากนั้นตามวันที่ของบทความ)

50 | บทความนี้หิน | 4 กุมภาพันธ์ 2009
35 | บทความนี้ค่อนข้างดี | 1 กุมภาพันธ์ 2009
5 | บทความนี้ไม่ร้อนแรง 25 มกราคม 2009

SQL ที่เกี่ยวข้องที่ฉันใช้คือ:

ORDER BY article_rating, article_time DESC

ฉันสามารถเรียงลำดับอย่างใดอย่างหนึ่ง แต่ไม่ใช่ทั้งสองอย่าง

คำตอบ:


480

การเรียงลำดับเริ่มต้นกำลังขึ้นคุณต้องเพิ่มคำหลัก DESC ลงในคำสั่งซื้อของคุณทั้งสอง:

ORDER BY article_rating DESC, article_time DESC

แปลก เมื่อฉันมีสองคอลัมน์ชื่อและผลรวมและต้องการเรียงลำดับตัวอักษรตามชื่อและ DESC โดยรวมแล้วฉันเห็นเท่านั้นว่ามันเรียงตามชื่อ แต่ไม่ใช่ทั้งหมด
Eugene

ฉันแฮ็คกับ (-1) * field1, field2 โดยไม่มีเหตุผลในฟิลด์ตัวเลข ... ขอบคุณ
Asad Hasan

ฮ่าฮ่าฮ่า .... ไม่ใช่คำถามที่ดีเพราะถ้าคุณลองไม่สามารถเรียงลำดับหมวดหมู่ค่า "ว่างเปล่า" อีกครั้งลองดีในปี 2009 .. แต่ในปี 2015 ทำงานไม่ถูกต้อง;) ถูกต้องคือ "3 ข้อความค้นหาย่อย "หรือ" 2 "
delive

แบบสอบถามดังกล่าวไม่ทำงานในกรณีของฉัน .. Tn กรณีนี้ฉันไม่ได้รับการเรียงลำดับสำหรับเมืองเลือกเมืองที่แตกต่างกัน, ประเทศจากลูกค้าสั่งซื้อโดยประเทศเรียง, เมืองเรียง;
Pra_A

4
ฉันไม่รู้ว่าทำไมนี่ถูกตรวจสอบว่าเป็นคำตอบ แต่มันก็ยังไม่ เรียงลำดับตามคอลัมน์แรกจากนั้นเลือกที่สอง แต่ไม่ใช่ทั้งสองอย่างในเวลาเดียวกัน
aidonsnous

34
ORDER BY article_rating, article_time DESC

จะเรียงลำดับตาม article_time เฉพาะเมื่อมีสองบทความที่มีอันดับเดียวกัน จากทั้งหมดที่ฉันเห็นในตัวอย่างของคุณนี่คือสิ่งที่เกิดขึ้น

 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.

คำตอบนี้ช่วยฉันได้ไหมขอบคุณ @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCในตอนท้ายจะเรียงตามคอลัมน์ทั้งสองจากมากไปน้อย คุณต้องระบุASCหากคุณต้องการมันเป็นอย่างอื่น


8

นี่อาจช่วยคนที่กำลังมองหาวิธีจัดเรียงตารางสองคอลัมน์ แต่ในลักษณะที่เป็นอัมพาต ซึ่งหมายถึงการรวมสองประเภทโดยใช้ฟังก์ชั่นการเรียงลำดับรวม มันมีประโยชน์มากเมื่อเช่นการดึงบทความโดยใช้การค้นหาแบบเต็มและยังเกี่ยวข้องกับวันที่เผยแพร่บทความ

นี่เป็นเพียงตัวอย่างเท่านั้น แต่ถ้าคุณเข้าใจความคิดคุณจะพบฟังก์ชั่นรวมจำนวนมากที่จะใช้ คุณสามารถชั่งน้ำหนักคอลัมน์เพื่อเลือกได้มากกว่าหนึ่งวินาที ฟังก์ชั่นของฉันใช้เวลาสุดขั้วจากทั้งสองประเภทดังนั้นแถวที่มีค่าที่สุดจะอยู่ด้านบนสุด

ขออภัยถ้ามีวิธีแก้ไขปัญหาที่ง่ายกว่าในการทำงานนี้ แต่ฉันไม่พบเลย

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

34
โอ้พระเจ้าทำไมคุณโพสต์รหัสดังกล่าวสำหรับคำถามง่าย ๆ
เบ็นซินแคลร์

4

ต่อไปนี้จะเรียงลำดับข้อมูลของคุณขึ้นอยู่กับคอลัมน์ทั้งสองในลำดับถัดลงมา

ORDER BY article_rating DESC, article_time DESC

3
สำเนาของคำตอบที่ยอมรับได้ใน 4 ปีต่อมาได้รับ upvotes มากมายนี้อย่างไร
Stack Underflow

อาจเป็นเพราะการอธิบาย: P
Rizwan Haider
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.