MySQL - IN () içindeki değerlere göre SİPARİŞ VER


107

Aşağıdaki sorguda döndürülen öğeleri IN () işlevine girildikleri sıraya göre sıralamayı umuyorum .

GİRİŞ:

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

ÇIKTI:

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

Herhangi bir fikir?

Yanıtlar:


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

SAHA işlevi dizeleri kalan listedeki ilk dizenin konumunu döndürür.

Ancak, sıralama düzeninizi temsil eden dizine alınmış bir sütuna sahip olmak ve ardından bu sütuna göre sıralamak performans açısından çok daha iyidir.


9
@Vladimir - evet, MySQL'e özgüdür. Soru mysql etiketine sahiptir.
Ayman Hourieh

Harika, DB geçişinden sonra Oracle'ın "kod çözme" işlevinin yerini aldı.
Martin Lyne

7
Dikkatli. Herhangi bir bilinmeyen özellik değeri (listede olmayan) bilinen değerlere göre önceliğe sahip olacaktır, yani FIELD(letter, 'A', 'C')liste önce B harfi olan girdileri döndürecektir ( A | B | Cdeğerleri olan bir kayıt kümesi varsayılarak ). Bundan kaçınmak için listeyi ters çevirin ve DESC, yani FIELD(letter, 'C', 'A') DESC.
Gajus

Bunu SQL sunucusunda nasıl başarırım.
user123456

29

Buradan başka bir seçenek: 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;

Yani sizin durumunuzda (test edilmemiş)

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';

Ne yaptığınıza bağlı olarak biraz tuhaf buldum ama biraz oynadıktan sonra her zaman işe yaramasını sağladım.


Bu, önerilen başka bir yanıt olarak field () işlevini kullanmaktan daha iyi olabilir, çünkü field () kullanmak dizin kullanımını engelleyecektir, ancak bu yöntemi kullanarak bir dizin kullanma şansı vardır (yine de dizini ne kadar iyi kullanabileceğinden emin değilim)
ʞɔıu


3

Bu, birine yardımcı olabilir (SP'de p_CustomerId geçirilir):

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;

Açıklama: Hesap listesini göstermek istiyorum. Burada sp'de bir müşteri kimliği geçiriyorum. Şimdi, söz konusu müşterilere bağlı hesaplara sahip hesap adlarını üstte ve ardından diğer hesapların alfabetik sırayla gösterilmesini sağlayacak.


2

Tablonuzda sıralama düzenini belirttiğiniz başka bir sütuna (sayısal) ihtiyacınız var. IN yan tümcesi bu şekilde çalışmaz.

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

2
İstenilen sıra sorgu başına olabilir.
Vladimir Dyuzhev

0

sadece kullan

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

gibi durumdan kaçının

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

sırasız sonuç satırı ile bitecek: 1 ve 11 alternatif

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.