2009-08-26 24 views
53

İçinde ID'ler bulunan bir PHP dizim var. Bu numaralar zaten sipariş edildi.MySQL SİPARİŞ BY IN()

Şimdi tüm kimlikleri almak için sonucumu IN() yöntemiyle almak istiyorum. Bununla birlikte, bu kimliklerin IN yönteminde olduğu gibi sıralanması gerekir. Örneğin

:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

Herhangi önerileri:

IN(4,7,3,8,9) 

gibi bir sonuç vermeli mi? Belki bunu yapmak için bir işlev var mı?

Teşekkürler!

+0

Bu numaralarla ilişkili diğer veriler nelerdir? Bu sırayla neden istediğini bize bir ipucu verebilir. – Randell

cevap

125

sana işlevi FIELD arıyor olabilir düşünün!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Tam olarak. Ben sadece Paul Dubois'in MySQL Yemek Kitabına bakıyordum ve onu buldum: SELECT id, ad FROM makaleleri NEREDE id IN (7,4,21) ALIŞVERİŞ SAYFASI (id, 7,4,21) Teşekkürler! –

+0

Darn insanlar hızlı. ;-) – deceze

+0

@Henk, size yardım ettiğim için mutluyum, ancak bir kabul, bir o kadar çok tuhaf bir olaydır - beni önceden almadığınız herhangi bir sebepten dolayı -) –

-3

Sadece doğru sıralamayı ifade etmelisiniz.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

Verilerinizi örneğinizde olduğu gibi neden sıralanmamış olarak sipariş etmek istersiniz? Uzun sorguları concatening sakıncası yoksa

, bu şekilde deneyin:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Teşekkürler. Ama bu hile yapmaz: SEÇİM kimliği, adı FROM makaleleri WHERE id IN (7,4,21) SİPARİŞ FORMU 7,4,21 göstermelidir. Ama bunun yerine şunu gösterecektir: 4,7,21 ... –

+2

Birlik * garanti emri değildir. – paxdiablo

+0

Doğru, bu yüzden ikinci vuruşum, aranan 'düzen' verecek ama en tatlı şey değil. –

0

Standart SQL (MySQL may bunu yapmanın bir yolunu sağlamaz, ancak satıcı-nötr yüzden çözümleri tercih DBMS'yi herhangi bir zamanda değiştirebilir.

Bu, sonrası işlem sonrası işleminde yapmanız gereken bir sonuç kümesi döndürülür. SQL yalnızca "order by" maddesinde belirtilen bir sırayla (veya 'da siparişinde böyle bir madde yoksa siparişte) döndürebilir.

Diğer olasılık (bunu beğenmeme rağmen, size seçim yapmak için onur duyuyorum), her kimlik için bir tane veritabanına birden fazla gezinti yapmak ve bunları geldikleri gibi işlemek: de, bu sayılar için çalışıyor normalde bir dize fonksiyonu olarak düşünülebilir ise -

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Standart SQL'de 'CASE col WHEN * 1.-val * THEN 1 WHEN * 2nd-val * THEN 2 ... END' – derobert

+1

kullanarak yapabilirsin ... böyle bir şeyi tavsiye etmem! – derobert

8

Sen FIELD() kullanabilirsiniz:

ORDER BY FIELD(id, 3,2,5,7,8,1) 

dizge1, str2, str3 ... Listede str indeksi (pozisyon) döndürür. Str bulunmazsa 0 döndürür.

Bu bir tür çirkin bir hack olsa da, gerçekten sadece başka bir seçeneğiniz yoksa kullanın. Uygulamanızda çıktının sıralanması daha iyi olabilir.