mySQL

2012-02-21 15 views
88

içinde özel bir sipariş nasıl tanımlanır MySQL'de özel sıralama sırasını nasıl tanımlarım. TRK, ilk sonra JPN ve son olarak DAN geliyor I = o Dili böylece Dil ve artan kimliğine göre sıralanmış tüm satırları dönmek istiyorum buradamySQL

ID Language Text 
0 ENU   a 
0 JPN   b 
0 DAN   c  
1 ENU   d 
1 JPN   e 
1 DAN   f 
2 etc... 

:

Ben bu tabloyu düşünün istediğini anlatmaya çalışmak.

sonucu: a, d, b, e, c, vs. f

Bu mümkün olabilir mi? O sadece üç değeri ise

cevap

195

MySQL, bu gibi görevler için mükemmel olan FIELD() adlı kullanışlı bir işleve sahiptir. Diğer DBMSs böyle fonksiyonu olmayabilir olarak, SQL az taşınabilir yapar

  1. olduğunu ancak

    ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

    Not

  2. zaman dilde (ya da diğer değerler listeniz için sıralama) çok daha uzun sürer, onlar için sortorder sütunuyla ayrı bir tabloya sahip olmak ve sipariş vermek için sorgularınıza katılmak daha iyidir.

+2

Teşekkürler Bu, sadece iki değerle sipariş vermem gereken durumum için mükemmel bir durumdur (örneğin bir ana dil, örneğin JPN ve bir geri dönüş dili, örneğin ENU). – Muleskinner

+1

Sadece bana yeni bir yazı yazdınız :) –

+1

Daha önce "GROUP BY" alanınız varsa ne olacak? Örneğin, istediğim ilk değer, sonunda belirir? – Pathros

31

, o zaman kullanabilirsiniz a CASE expression:

ORDER BY `ID`, 
     CASE `Language` 
     WHEN 'ENU' THEN 1 
     WHEN 'JPN' THEN 2 
     WHEN 'DAN' THEN 3 
     END 

(diğer değerleri olabilir, o zaman tutarlı sipariş tutmak için bazı ekstra mantığı eklemek isteyebilirsiniz; örneğin ilk değiştirmek için Dil olduğunu

ORDER BY `ID`, 
     CASE `Language` 
     WHEN 'ENU' THEN 1 
     WHEN 'JPN' THEN 2 
     WHEN 'DAN' THEN 3 
     ELSE 4 
     END, 
     `Language` 
) 
+1

Ve birçok Dili değerleri varsa ayrı bir tablo, bu ilk kimliğine göre sipariş edecek her Dili artı o – kaj

+0

bir sıralama düzeni sütun ve bağlantıyı depolayan a, b, c, d, e sonuçlanan olabilir , f – piotrm

+0

Teşekkürler bu mükemmel çalışır - Mchl cevabını daha kolay göründüğü gibi kabul ettiğim gibi – Muleskinner

13

sen hazırlıksız birkaç seçenek vardır:, üçüncü sipariş kriteri olarak Language tarafından daha sonra sırası kendisini o CASE ifadeye ELSE 4 ekleyin ve belki ENUM (bunun mümkün olduğunu varsayarsak ve yalnızca birkaç varyasyon beklersiniz)

ENUM('ENU','JPN','DAN') olarak belirtirseniz, ORDER Language ASC belirtmiş olduğunuz sırayla sipariş verilecektir. İkinci yerde dava içerecektir

, yani

SELECT * FROM table 
ORDER BY CASE Language 
    WHEN 'ENU' THEN 3 
    WHEN 'JPN' THEN 2 
    WHEN 'DAN' THEN 1 
    ELSE 0 
END DESC, ID ASC 

Performans açısından ENUM yöntemi daha hızlı sonuç, ancak daha fazla dil eklemek gerekirse daha güçlük olacaktır. Üçüncü bir seçenek ise, Diller için normalleştirme tablosu eklemektir, ancak bu örnekte aşırı miktarda olabilir.

+0

"ENUM ('ENU', 'JPN', 'DAN')' türlerini tam olarak nereye yazıyorsunuz? – Pathros

+1

@pathros, tablo tanımında VARCHAR vb. Yerine ENUM olarak belirtirsiniz.Dahili olarak MySQL, ENUM seçeneklerini belirli bir sırayla depolar ve bunları indeksler, böylece bir ENUM sütununa göre sipariş verirken, özellikle dize değerleri yerine bu iç indeksi kullanır (CAST(), bir VARCHAR'a geri döndürmek için kullanılmazsa) –

+0

DESC, 'SON DAMLA DESC,' olmalıdır? –