MySQL - ORDER BY ค่าภายใน IN ()


108

ฉันหวังที่จะเรียงลำดับรายการกลับมาในการค้นหาต่อไปโดยลำดับที่พวกเขากำลังเข้าสู่ใน () ฟังก์ชัน

อินพุต:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

เอาท์พุท:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

ความคิดใด ๆ ?

คำตอบ:


232
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

FIELDฟังก์ชันส่งกลับตำแหน่งของสายแรกในรายการที่เหลือของสตริง

อย่างไรก็ตามควรมีคอลัมน์ที่จัดทำดัชนีซึ่งแสดงถึงลำดับการจัดเรียงของคุณแล้วจัดเรียงตามคอลัมน์นี้จะดีกว่ามาก


9
@ วลาดิเมียร์ - ใช่เป็นเฉพาะ MySQL คำถามมีแท็ก mysql
Ayman Hourieh

ยอดเยี่ยมแทนที่ฟังก์ชัน "ถอดรหัส" ของ Oracle หลังจากสวิตช์ DB
Martin Lyne

7
ระวัง. ค่าคุณสมบัติใด ๆ ที่ไม่รู้จัก (ไม่อยู่ในรายการ) จะมีความสำคัญเหนือกว่าค่าที่ทราบกล่าวคือFIELD(letter, 'A', 'C')รายการจะส่งคืนรายการด้วยตัวอักษร B ก่อน (สมมติว่าชุดของระเบียนที่มีA | B | Cค่า) เพื่อหลีกเลี่ยงการที่ผกผันรายการและการใช้ DESC FIELD(letter, 'C', 'A') DESCคือ
Gajus

ฉันจะบรรลุสิ่งนี้ในเซิร์ฟเวอร์ SQL ได้อย่างไร
user123456

29

ตัวเลือกอื่นจากที่นี่: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

ดังนั้นในกรณีของคุณ (ยังไม่ทดลอง) ก็จะเป็นเช่นนั้น

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

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


สิ่งนี้อาจดีกว่าการใช้ฟังก์ชัน field () เป็นคำตอบอื่นที่แนะนำเนื่องจากการใช้ field () จะกีดกันการใช้ดัชนี แต่มีโอกาสที่จะใช้ดัชนีโดยใช้วิธีนี้ (ไม่แน่ใจว่าจะใช้ดัชนีได้ดีเพียงใด)
ʞɔıu


3

สิ่งนี้อาจช่วยใครบางคนได้ (p_CustomerId ถูกส่งผ่านใน SP):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

คำอธิบาย: ฉันต้องการแสดงรายการบัญชี ฉันกำลังส่งรหัสลูกค้าใน sp. ตอนนี้จะแสดงรายชื่อบัญชีที่มีบัญชีที่เชื่อมโยงกับลูกค้าที่แสดงไว้ที่ด้านบนตามด้วยบัญชีอื่น ๆ ตามลำดับตัวอักษร


2

คุณต้องมีคอลัมน์อื่น (ตัวเลข) ในตารางของคุณซึ่งคุณจะระบุลำดับการจัดเรียง คำสั่ง IN ไม่ทำงานในลักษณะนี้

B - 1
A - 2
D - 3
E - 4
C - 5

2
คำสั่งซื้อที่ต้องการอาจเป็นแบบต่อแบบสอบถาม
Vladimir Dyuzhev

0

เพียงแค่ใช้

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

หลีกเลี่ยงสถานการณ์เช่น

 INSTR('1,2,3,11' ,`field`) 

จะลงท้ายด้วยแถวผลลัพธ์ที่ไม่เรียงลำดับ: 1 และ 11 ทางเลือก

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