ลำดับ Mysql ตามค่า ID เฉพาะ


96

เป็นไปได้ไหมที่จะเรียงลำดับใน mysql โดย "เรียงตาม" โดยใช้ชุดค่าคอลัมน์ (ID) ที่กำหนดไว้ล่วงหน้าเช่น: เรียงลำดับตาม (ID = 1,5,4,3) ดังนั้นฉันจะได้รับระเบียน 1, 5, 4, 3 ในนั้น ออกคำสั่ง?

UPDATE:เกี่ยวกับการใช้ mysql ในทางที่ผิด ;-) ฉันต้องอธิบายว่าทำไมฉันถึงต้องการสิ่งนี้ ...

ฉันต้องการให้บันทึกของฉันเปลี่ยนการจัดเรียงแบบสุ่มทุกๆ 5 นาที ฉันมีงาน cron ที่ต้องทำตารางอัพเดตเพื่อใส่ลำดับการจัดเรียงแบบสุ่มที่แตกต่างกัน มีเพียงปัญหาเดียว! PAGINATION. ฉันจะมีผู้เยี่ยมชมที่มาที่เพจของฉันและฉันให้ผลลัพธ์ 20 รายการแรกแก่เขา เขาจะรอ 6 นาทีและไปที่หน้าที่ 2 และเขาจะได้ผลลัพธ์ที่ไม่ถูกต้องเนื่องจากลำดับการจัดเรียงมีการเปลี่ยนแปลงทั้งหมด

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

มีวิธีอื่นที่ดีกว่าในการทำเช่นนี้หรือไม่?


คุณกำลังถามว่ามีวิธีที่ mysql สามารถสั่งซื้อโดยไม่เจาะจงได้หรือไม่?
stefgosselin

1
มันเสียงเหมือนทั้งรูปแบบข้อมูลของคุณเสีย / ไม่สมบูรณ์ ( ที่ไม่คำสั่งนี้มาจากไหน?) หรือหรือคุณกำลังดูถูก MySQL
derobert

คำตอบ:


204

คุณสามารถใช้ฟังก์ชัน ORDER BY และ FIELD ดูhttp://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

มันใช้ฟังก์ชันField ()ซึ่ง "ส่งกลับดัชนี (ตำแหน่ง) ของ str ในรายการ str1, str2, str3, ... ส่งกลับ 0 หากไม่พบ str" ตามเอกสารประกอบ ดังนั้นคุณจัดเรียงผลลัพธ์ที่กำหนดโดยค่าที่ส่งกลับของฟังก์ชันนี้ซึ่งเป็นดัชนีของค่าฟิลด์ในชุดที่กำหนด


ฉันดูเหมือนจะไม่สามารถใช้งานได้โดยไม่ต้องใช้: WHERE ID IN (1,5,4,3)
TV-C-15

1
คุณจะใช้สิ่งนี้โดยไม่มีค่าอย่างไร
Nono London

30

คุณควรจะสามารถใช้CASEสำหรับสิ่งนี้:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

ในเอกสารอย่างเป็นทางการของ mysql เกี่ยวกับORDER BYมีคนโพสต์ว่าคุณสามารถใช้FIELDสำหรับเรื่องนี้ได้ดังนี้:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

นี่คือรหัสที่ยังไม่ทดสอบซึ่งในทางทฤษฎีควรใช้งานได้


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

ตัวอย่างเช่นหากฉันมีการลงทะเบียน 10 รายการด้วยวิธีนี้รหัส 1, 5, 4 และ 3 จะปรากฏขึ้นก่อนการลงทะเบียนอื่น ๆ จะปรากฏขึ้นเป็นลำดับ

การจัดแสดงปกติ 1 2 3 4 5 6 7 8 9 10

ด้วยวิธีนี้

8 5 4 3 1 2 6 7 9 10


โอเคขอบคุณสำหรับคำแนะนำ
Bruno Mangini Alves

6

มีวิธีอื่นในการแก้ปัญหานี้ เพิ่มตารางแยกต่างหากดังนี้:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

ตารางนี้จะถูกใช้เพื่อกำหนดกลไกการสั่งซื้อของคุณเอง

เพิ่มค่าของคุณที่นั่น:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... แล้วแก้ไขคำสั่ง SQL ของคุณในขณะที่เข้าร่วมตารางใหม่นี้

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

โซลูชันนี้ซับซ้อนกว่าโซลูชันอื่นเล็กน้อย แต่เมื่อใช้วิธีนี้คุณไม่จำเป็นต้องเปลี่ยนSELECT-statement เมื่อใดก็ตามที่เกณฑ์การสั่งซื้อของคุณเปลี่ยนไปเพียงแค่เปลี่ยนข้อมูลในตารางคำสั่งซื้อ


1

หากคุณต้องการสั่งซื้อ id เดียวก่อนในผลลัพธ์ให้ใช้ id

select id,name 
from products
order by case when id=5 then -1 else id end

หากคุณต้องการเริ่มต้นด้วยลำดับของรหัสหลายรายการให้ระบุคอลเลกชันที่คล้ายกับสิ่งที่คุณจะใช้กับINคำสั่ง

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

เพิ่มคำอธิบายเพิ่มเติม
Mathews Sunny

หากคุณต้องการใช้ order by สำหรับ id เดียวให้ใช้ 1 st query และถ้าคุณต้องการหลาย id ให้ใช้ 2nd query
Rajesh Kharatmol

0

หากคุณต้องการสั่งซื้อ id เดียวในผลลัพธ์ให้ใช้ลำดับตามกรณี (เช่นคุณต้องการให้ตัวเลือก "อื่น ๆ " ในรายการสุดท้ายและรายชื่อเมืองทั้งหมดแสดงตามลำดับตัวอักษร)

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

ตัวอย่างเช่นหากฉันมี 5 เมืองฉันต้องการแสดงเมืองตามลำดับตัวอักษรโดยตัวเลือก "อื่น ๆ " จะปรากฏเป็นอันดับสุดท้ายในเมนูแบบเลื่อนลงเราสามารถใช้คำค้นหานี้ได้ ดูตัวอย่างอื่น ๆ แสดงในตารางของฉันที่รหัสที่สอง (id: 2) ดังนั้นฉันจึงใช้ "เมื่อ id = 2" ในแบบสอบถามด้านบน

บันทึกในตาราง DB:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

ผลลัพธ์ของฉัน:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
ลองเพิ่มคำอธิบายลงในโค้ดของคุณมันจะทำให้คำตอบของคุณชัดเจนและเข้าใจมากขึ้น โปรดอ่านstackoverflow.com/help/how-to-answer
32cupo

หากคุณต้องการใช้คำสั่งโดยสำหรับ id เดียว (เช่นคุณต้องการให้ตัวเลือก "อื่น ๆ " ในรายการเมืองสุดท้ายและรายการเมืองทั้งหมดแสดงตามลำดับตัวอักษร) เพื่อให้คุณสามารถใช้แบบสอบถามนี้ได้ มันใช้ได้ผลสำหรับฉัน
Preeti

-1
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
คุณช่วยอธิบายเพิ่มเติมได้ไหม สิ่งนี้ดูเหมือนกับคำตอบที่ยอมรับ แต่ฉันไม่คิดว่านั่นASC OR DESCเป็นไวยากรณ์ที่เหมาะสม
Nico Haase

@NicoHaase ความแตกต่างระหว่าง ASC และ DESC คือถ้าคุณใช้ asc แล้วรหัสที่คุณใช้ในฟังก์ชันฟิลด์จะเข้ามาในท้ายที่สุดและถ้าคุณใช้ DESC รหัสในฟังก์ชันฟิลด์จะมาก่อน
Hisham shahid

@NicoHaase คุณสามารถใช้ ASC หรือ DESC กับแบบสอบถามใดก็ได้ที่สอดคล้องกับความต้องการ
Hisham shahid

ดังนั้นคุณจึงไม่สามารถใช้ทั้งสองในแบบสอบถามเดียวได้ Nico ฉันคิดว่าการแนะนำให้คุณทำให้คำตอบของคุณถูกต้องตามหลักไวยากรณ์ ฉันค่อนข้างแน่ใจว่าเขาคุ้นเคยกับสิ่งที่ ASD และ DESC หมายถึงจริง ๆ :)
RiggsFolly

สิ่งนี้ไม่สมเหตุสมผลและจะไม่ได้ผลแน่นอน คุณจำเป็นต้องใช้FIELDฟังก์ชันซึ่งเหมือนกับคำตอบที่ยอมรับเมื่อ 8 ปีก่อน
แฮ็ค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.