การสั่งซื้อ SQL แบบหลายคอลัมน์


635

ฉันกำลังพยายามเรียงลำดับตามคอลัมน์ต่างๆใน SQL และไปในทิศทางที่ต่าง column1จะเรียงจากมากไปน้อยและcolumn2จากน้อยไปมาก

ฉันจะทำสิ่งนี้ได้อย่างไร


85
นี่คือผลลัพธ์แรกของ "googling answer" อย่างน้อยก็เมื่อฉัน googled "สั่ง sql สองคอลัมน์" มันเป็นนรกที่สามารถอ่านได้มากกว่าหน้าเอกสารทางการเทียบเท่าที่ไม่ปรากฏในหน้าแรกของผลลัพธ์จนกว่าฉันจะเปลี่ยนแบบสอบถามเป็น "mysql 'สั่งโดย'"
Andrew Martin

11
เมื่อพิจารณาว่าคำถาม SO มาเป็นอันดับต้น ๆ ของ Google ฉันพบว่ามันแย่มากที่ผู้คนตอบด้วย ดังนั้นทั้งที่นี่เพื่อตอบหรือไม่และฉันไม่สามารถเข้าใจว่าทำไมการกำกับดูแลการเข้าชมเว็บไซต์ออกไปเป็นสิ่งที่ดี
user001

คำตอบ:


1023
ORDER BY column1 DESC, column2

สิ่งนี้จะเรียงลำดับทุกอย่างด้วยcolumn1(มากไปหาน้อย) ก่อนจากนั้นตามด้วยcolumn2(น้อยไปมากซึ่งเป็นค่าเริ่มต้น) เมื่อใดก็ตามที่column1เขตข้อมูลสำหรับสองแถวหรือมากกว่านั้นเท่ากัน


2
นี่คือวิธีการสั่งซื้อทั้ง column1 หรือ column2?
PoliDev

@PoliDev มันสั่งซื้อครั้งแรกโดย column1 ในการสั่งซื้อ DESCending และโดยคอลัมน์ 2 (ในลำดับ ASCending)
zaheer

110
เพื่อความชัดเจนนี่จะเรียงลำดับทุกอย่างเป็นลำดับcolumn1แรกและตามcolumn2เมื่อใดก็ตามที่column1เขตข้อมูลสำหรับสองแถวเท่ากัน
Nick Benes

2
มันจะทำงานกับนิพจน์จำนวนเท่าใดก็ได้ ( ไม่ใช่แค่คอลัมน์) จนถึงขีด จำกัด RDBMS ของคุณ
Ignacio Vazquez-Abrams

2
@NickBenes ... หรือคุณอาจจะบอกว่ามันจะเรียงลำดับจากcolumn2นั้นดำเนินการ STABLE column1เรียงลำดับตาม นี่ชัดเจนสำหรับคนที่รู้ว่าการเรียงลำดับที่เสถียรคืออะไร
Atom

356

คำตอบอื่น ๆ ไม่มีตัวอย่างที่เป็นรูปธรรมดังนั้นที่นี่มันจะไป:

รับตารางPeopleดังต่อไปนี้:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826

หากคุณดำเนินการค้นหาด้านล่าง:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

ชุดผลลัพธ์จะมีลักษณะดังนี้:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

23
คำตอบนี้เป็นอาหารเสริมที่ยอดเยี่ยมสำหรับคำตอบที่เป็นประโยชน์และสั้นมาก
enderland

3
นี่คือตัวอย่างที่ดีหลายคนคิดว่าคุณสามารถเรียงลำดับ 2 คอลัมน์ในครั้งเดียวซึ่งจริง ๆ แล้วจะไม่เกิดขึ้นแม้ว่าคุณจะใส่ 2 คอลัมน์เพื่อสอบถามคำสั่งซื้อ
Muhammad Faraz

มันให้ผลลัพธ์ที่เหมือนกันเมื่อเราเรียงลำดับด้วยสามคอลัมน์และลำดับการเรียงคอลัมน์แรกเหมือนกันและทุกอย่างจะแตกต่างกัน Ex: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc มีวิธีการใด ๆ ที่เราสามารถเอาชนะนี้หรือไม่?
Paramesh Korrakuti

1
@ParameshKorrakuti: นั่นคือผลลัพธ์ที่คาดหวัง การเรียงลำดับผลลัพธ์ในตัวอย่างของคุณจะแตกต่างกันหากมีFirstName, LastNameรายการซ้ำซ้อนที่แตกต่างกันYearOfBirth
Thomas CG de Vilhena

ขอบคุณสำหรับตัวอย่างมันทำให้คนอย่างฉันเข้าใจ
Thippu


19

การสั่งซื้อหลายคอลัมน์ขึ้นอยู่กับค่าที่สอดคล้องกันของทั้งสองคอลัมน์: ที่นี่คือตัวอย่างตารางของฉันที่มีสองคอลัมน์ชื่อที่มีอักษรและตัวเลขและค่านิยมในทั้งสองคอลัมน์ที่มีการเรียงและรายละเอียดการสั่งซื้อ

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันทำการสั่งซื้อโดยในคอลัมน์ทั้งสองนี้โดยดำเนินการคำสั่งด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันใส่ค่าใหม่ในคอลัมน์ทั้งสองนี้อีกครั้งโดยที่ค่าตัวอักษรในลำดับASC :

ป้อนคำอธิบายรูปภาพที่นี่

และคอลัมน์ในตารางตัวอย่างมีลักษณะเช่นนี้ ตอนนี้ทำการดำเนินการอีกครั้ง:

ป้อนคำอธิบายรูปภาพที่นี่

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


(g, 10),(g,12)ยังแทรกข้อมูลนี้มากเกินไป จากนั้นเรียกใช้คำสั่งซื้อตามคำสั่งของคุณคุณจะได้รับคอลัมน์ที่สองเป็นASCคำสั่งซื้อ (นั่นหมายความว่าg-10,g-11,g-12)
Pugal

6

คุณสามารถใช้การสั่งซื้อหลายครั้งในหลายเงื่อนไข

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

การจัดทำดัชนีใช้งานได้หรือไม่หากฉันใช้ "CASE" ใน "ORDER BY"
Rousonur Jaman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.