Kayıt için
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
iyi çalışmalı çünkü listedeki WHERE
maddeyi sipariş etmek zorunda değilsin
Nasıl çalıştığına gelince,
FIELD () , aradığınız değer varsa virgülle ayrılmış bir listenin dizin konumunu döndüren bir işlevdir.
- İd = 1 ise, FIELD (id, 3,2,1,4) , 3 değerini döndürür (1'in listede bulunduğu konum).
- İd = 2 ise, FIELD (id, 3,2,1,4) , 2 değerini döndürür (2 listedeki pozisyon)
- İd = 3 ise, FIELD (id, 3,2,1,4) , 1 değerini döndürür (3'ün listede bulunduğu konum).
- Eğer ID = 4 ise FIELD (id, 3,2,1,4) 4 döndürür (4'ün listede olduğu pozisyon)
- İd = başka bir şey olursa, ALAN (id, 3,2,1,4) 0 değerini döndürür (listede değil)
ORDER BY
Değerleri şey tarafından değerlendirilir ALANI () döner
Her çeşit fantezi siparişi oluşturabilirsiniz
Örneğin, IF () işlevini kullanarak
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
Bu, listenin başında ilk 4 kimliğin görünmesine neden olur, Aksi takdirde, alt tarafta belirir. Neden?
İçinde ORDER BY
0 veya 1 olsun.
- İlk sütun 0 ise, ilk 4 kimliğin herhangi birinin görünmesini sağlayın.
- İlk sütun 1 ise, daha sonra görünmesini sağlayın
İlk sütunda DESC ile çevirelim
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
İçinde, ORDER BY
hala 0 veya 1 olsun.
- İlk sütun 1 ise, ilk 4 kimliden başka bir şey yapmayın.
- İlk sütun 0 ise, ilk 4 kimliği orijinal sırada görünmesini sağlayın.
GERÇEK SORULARINIZ
Bu konuda ciddiyetle içsel istiyorsanız , Kitabın 189 ve 192. Sayfalarına bakınız.
Gerçek bir derin dalış için.
Temelde, ORDER *order
( ORDER BY
İfade ağacı) adında bir C ++ sınıfı vardır . Olarak JOIN::prepare
, *order
bilinen bir fonksiyonun kullanılır setup_order()
. Neden JOIN
sınıfın ortasında ? Her sorgu, tek bir masaya karşı bile bir sorgu, her zaman bir JOIN olarak işlenir (Yazımı görün. Bir JOIN koşulu ile bir WHERE koşulu arasında bir yürütme farkı var mı? )
Bütün bunların kaynak kodu sql/sql_select.cc
Açıkça, ORDER BY
ağaç değerlendirmesini yapacak FIELD(id,3,2,1,4)
. Dolayısıyla, 0,1,2,3,4 sayıları, ilgili satıra referans yapılırken sıralanan değerlerdir.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
Ardından ekleyinORDER BY f
veyaORDER BY FIELD(id,3,2,1,4)
tekrar deneyin.