Keyfi bir sipariş başına Sınıflandırma SQL satır çıktı?

3 Cevap php

Yani, benim veritabanında, ben enstrüman isimlerini (ve çeşitli diğer nitelikleri) saklayabilirsiniz. En id birincil anahtar, ve name, benzersiz bir anahtar diyelim.

Bir PHP script olarak, ben onların araç sınıfı ile öğeleri seçin, şöyle:

$name = mysql_real_escape_string($_POST['name']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM `instruments` WHERE name LIKE '%$name%' ORDER BY id"));

Sonuç tablosu:

id    name
1     "Flute 2"
2     "Bass Flute"
3     "Flute 10"
4     "Flute 7"

Bu bana sadece "Saksafon" sorgulayarak "Soprano Saksafon", "Alto Saksafon", vb gibi araçların tüm aile, seçmenize olanak sağlar.

Bu özel örnekte, sonuç (eğer auto_incremented varsayabiliriz olan) kendi id tarafından orered edilir. Daha ideal evet, alfabetik sıraya göre sipariş olurdu?

id    name
2     "Bass Flute"
3     "Flute 10"
1     "Flute 2"
4     "Flute 7"

O çalışıyor, ama müzisyenler olmak, onlar DB admin ile etrafında vida gibi ve Flüt sonuçlarında "Flüt" yukarıda listelenen "Bas flüt" sahip kibarca almak, ve really 'don yok t "Flüt 2" önce listede "Flüt 10" olan kibarca alır.

Yani, hayır ORDER BY score_order var gibi görme (bu çok kolay olurdu, o ... olmaz), nasıl düzgün araçlarını görüntülemek için sistemi sipariş çeşit tanıtmak olabilir?

Upon brainstorming, I came upon one solution: I could add one more column of type integer, and "rank" the instruments based on their importance (that is, Piccolos would be "1", Flutes "2", etc):

... nts` WHERE name LIKE '%$name%' ORDER BY rank, name"));

id    name           rank
3     "Flute 10"     2
1     "Flute 2"      2
4     "Flute 7"      2
2     "Bass Flute"   5

Ancak, bu "Flüt 10" "Flüt 2" önce gelir, alphanumerically gerçeğini hesaba katmaz.

İdeal sonuç tablosu (rank, ve sonra tarafından emretti name):

id    name           rank
6     "Piccolo"      1
1     "Flute 2"      2
4     "Flute 7"      2
3     "Flute 10"     2
5     "Alto Flute"   4
2     "Bass Flute"   5

Yani, benim sorular:

  1. Bu uygun bir çözüm olduğunu ve çaba uygulamak için değer mi?
  2. Yerine sayısına göre sayının tüm numarasını, analiz SQL sipariş kayıtları için bir yolu var mı?

Teşekkürler!

3 Cevap

Bu ideal sıralama düzeni ne olacağını bana tamamen açık değil, ama muhtemelen sadece veritabanı tablosundaki ekstra bir sütun yapmak gerekir. Siz çok kolay olurdu ORDER BY score_order söylüyorlar, ama neden bu kadar açık bir score_order alanını ve düzeni eklemek değil mi?

Böyle bir şey yapmanın farklı bir düzen oluşturabilirsiniz. Bu bir hack var.

select * from table
order by (
     case name
     when 'Health' then 0 
     when 'Flute 10' then 1
     when 'Freeze' then 2
     when 'Bass Flute' then 3
     end
)

Ve muhtemelen id sütununu kullanmak için iyi bir fikirdir.

select * from table
order by (
    case id
    when 3 then 0 
    when 1 then 1
    when 4 then 2
    when 2 then 3
    end
)

Ne yapacağını senin tabloda bir "öncelik" sütunu konur. Sonra (örneğin, taban araçlar 0 olurdu en önemli bunu sipariş: vb Flüt, Saksafon, Değişiklikler 1 olacaktır: Bas Flüt, Alto Flüt, vb, ve Sayılar 'öncelik onların sayısı + 100 veya onları koymak için bir şey olurdu sonunda ama hala sayısal sırayla).

(Aynı önceliğe durumlarda alfabetik ve sonra) sayıları sıralamak için en iyi yolu, sayısal numaralarını kullanarak gereğidir.

Edit: So, the above would give you something like this (the priority is in parentheis):
Flute (0)
Bass Flute (1)
Tenor Flute (1)
Flute 1 (101)
Flute 2 (102)
Flute 10 (110)