Php, mysql seçimi

3 Cevap php

Ben bu tablo ATTRIBUTE var

id     name       um
12    capacity  MB;GB;TB

Bu tablo2:

id    id_attribute  id_product    name       value     um
 1        12         40        hdd maxtor     30       GB
 2        12         41        hdd maxtor     40       GB
 3        12         42        hdd y           1       TB

Nasıl bu sırayla tablo2 seçebilirsiniz: 30GB 40GB 1TB?

Thanks a lot!

3 Cevap

Bu yüzden ne yapacağını mb sonucu içine iki sütun değerini ve UM dönüştürmek için bir işlevi oluşturmak olduğu gibi MB ile çalışmak isteyecektir. Yani fonksiyon tb için gb ve 1000000 MB için 1 ve 1000 ile değerini katlayacak. Daha sonra fonksiyonu üzerinde sipariş edebilirsiniz. Ama bu ideal bir performans olmayacak, ancak bu meta tarzı db ile bunu optimize tam olarak nasıl başka emin değilim.

Eğer o zaman sadece büyüklüğü başka şeyler için bu destek böylece fonksiyonu üzerinde çalıştı tüm UMS için bir çeviri tablosunu oluşturabilir Bu genişletmek için.

Bir örnek gibi bir tablo eklemek böylece

|Type  |UM |Magnitude|
______________________
|Size  |GB |1000     |
|Size  |MB |1        |
|Size  |TB |1000000  |
|Weight|g  |1        |
|Weight|kg |1000     |

Sonra fonksiyon UM ve büyüklüğünü aramak yapmak ve bu her zaman doğru sipariş için izin verecek çarpın.

Ayrıca bunun yerine sahip ölçüm türüne işaret etmek için öznitelik tablosunu değiştirebilirsiniz; ayrılmış bir liste.

"SELECT * FROM table2 ORDER BY um ASC, value ASC" What this does: First orders by UM, then orders by value. This only works because [by accident] GB is a string "smaller" than TB. I suggest switching these with numeric values, because MB is smaller than GB, but the string ain't.

Yani bu alanlar ile başka bir tablo yapın: um_id, um_name, um_order, sonra um_id ile UM değiştirin.

Regards, Gabriel

select value, um 
from tbl

order by 

case um 
when 'KB' then 1
when 'MB' then 2
when 'GB' then 3
when 'TB' then 4
else 5
end,

value

Dikkate almak istiyorsanız ancak 1200 GB> 1 TB, ve bunu, son sıralanır gerektiğini:

select value, um 
from tbl

order by value *

case um 
when 'KB' then 1000
when 'MB' then 1000000
when 'GB' then 1000000000
when 'TB' then 1000000000000
else 1000000000000000
end

[EDIT]

Jeff Beck'in masanın üzerinde sermaye:

select tbl.value, tbl.um 
from tbl
join unit /* name Jeff's table as unit */
on unit.um = tbl.um

order by 
    unit.type -- this will nicely "group" the related type
    ,tbl.value * unit.magnitude