Önce belirli alan değerine göre sıralama


92

3 sütunlu bir tablom var:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

Sonuç kümesini kullanarak priorityancak önce name=coredaha düşük önceliğe sahip olan satırları sıralamak istiyorum . Sonuç şöyle görünmeli

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

Yanıtlar:


160

Ayrıca MySQL FIELDişlevi de var .

Tüm olası değerler için tam sıralama istiyorsanız:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

Yalnızca "özün" önce geldiğini ve diğer değerlerin önemli olmadığını önemsiyorsanız:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

Önce "çekirdek" e ve diğer alanları normal sıralama düzenine göre sıralamak isterseniz:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

Yine de burada bazı uyarılar var:

İlk olarak, bunun yalnızca mysql işlevi olduğundan oldukça eminim - soru mysql olarak etiketlendi, ancak asla bilemezsiniz.

İkincisi, nasıl FIELD()çalıştığına dikkat edin : değerin bir tabanlı dizinini döndürür - değerin FIELD(priority, "core")"çekirdek" olması durumunda 1 döndürür. Alanın değeri listede değilse sıfır döndürür . Bu nedenle DESC, tüm olası değerleri belirtmediğiniz sürece gereklidir.


5
Yaklaşık 5 yıl sonra bu cevabı kabul ettim çünkü daha temiz ve daha hızlı.
Omid

db2 eşdeğeri?
Cybermonk

Benim için işe yaradı, nasıl işleneceği hakkında bir soru daha sormak istiyorum Eğer 'öncelik' sütunu örn: 'toprak çekirdeği', 'yeni tahta' gibi değerler içeriyorsa. Burada sütun tam bir değer içermiyor, şöyle bir şey yazabilir miyiz % çekirdek%?
Jayanth Suvarna

@JayanthSuvarna: MySQL FIELD () belgelerine baktığımda, her argümanın bir tür dizge olması gerektiğinden, bunu alt dizeler olarak değerlendirmenin bir yolu olmadığından eminim. Yardımcı olabilecek bazı dize işleme işlevleri olabilir, ancak emin değilim.
Nerdmaster

Teşekkürler dostum. Günümü gün ettin.
BEingprabhU

92

Genellikle yapabilirsin

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

Özellikle MySQL'de şunları da yapabilirsiniz:

select * from your_table
order by name <> 'core',
         priority 

MySQL'de bir karşılaştırmanın sonucu ya ya 0da olduğundan 1ve bu sonuca göre sıralayabilirsiniz.


1
ne yaptığını 1ve 2burada araçlar?
Niraj Chauhan

1
Sıralamak için yaklaşık 3000 satırım var. Benim durumumda @ Ayman-Hourieh'in stackoverflow.com/questions/958627/… adresindeki çözümü, bu çözüme kıyasla yarı zaman alıyor.
nightlyop

@nightlyop: İyi biri. Yalnızca bir not: Daha hızlı çözüm MySQL'e özgüdür.
juergen d

1ve 2verileri sıralamak için kullandığım 2 sayı. Olabilir 3ve 4veya başka bir şey.
juergen d

Ne var ne zaman %içinde WHEREfıkra? Beğen . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
yığın

6

Belirli satırları tercih etmenin bir yolu, önceliklerine büyük bir sayı eklemektir. Bunu bir CASEifade ile yapabilirsiniz :

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

Demo: http://www.sqlfiddle.com/#!2/753ee/1


5

Bu, Postgres 9+ kullanarak benim için çalışıyor:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

-1'i açıklamak ister misin? Hata + Postgres sürümü?
Vojtech Vitek

3

Bunun bir yolu şudur:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

1
Bu, coresatırların sırasını kaybetmez mi?
mellamokb

1
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

3
Kodunuz sorunun cevabı olsa da, onun hakkında biraz açıklama yapmak daha iyidir.
Mehraban

0

Bunu yap:

SELECT * FROM table ORDER BY column `name`+0 ASC

+0'ı eklemek şu anlama gelir:

0, 10, 11, 2, 3, 4

şu hale gelir:

0, 2, 3, 4, 10, 11

Bu teknik, bir dizgiyi sayıya dönüştürmek içindir. OP'nin sorusuna değinmiyor. (Ancak, veri türünü görmeden priority, ben olmadığını söyleyemeyiz olmalıdır komple çözümün parçası.)
Rick James

0

Bunu kullan:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")
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.