Php、mysql选择

Php、mysql选择,php,mysql,select,Php,Mysql,Select,我有这个表属性 id name um 12 capacity MB;GB;TB 表2: id id_attribute id_product name value um 1 12 40 hdd maxtor 30 GB 2 12 41 hdd maxtor 40 GB 3 12

我有这个表属性

id     name       um
12    capacity  MB;GB;TB
表2:

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
我如何按以下顺序从表2中选择:30GB 40GB 1TB

非常感谢

“从表2中选择*按um ASC排序,值ASC” 它的作用是:先按嗯下单,然后按价值下单。这只是因为[偶然]GB是一个比TB“小”的字符串。我建议用数值来切换,因为MB比GB小,但字符串不是

所以用这个字段做另一个表:um_id,um_name,um_order,然后用um_id替换um

问候,, Gabriel

“从表2中选择*按um ASC排序,值ASC” 它的作用是:先按嗯下单,然后按价值下单。这只是因为[偶然]GB是一个比TB“小”的字符串。我建议用数值来切换,因为MB比GB小,但字符串不是

所以用这个字段做另一个表:um_id,um_name,um_order,然后用um_id替换um

问候,, 加布里埃尔

但如果要考虑1200 GB>1 TB,并且必须最后排序,请执行以下操作:

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
[编辑]

利用Jeff Beck的表格:

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
但如果要考虑1200 GB>1 TB,并且必须最后排序,请执行以下操作:

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
[编辑]

利用Jeff Beck的表格:

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

您将希望它也能与MB一起工作,所以我要做的是创建一个函数,将两列value和UM转换为MB结果。因此,对于mb,该函数将该值乘以1,对于gb,该值乘以1000,对于tb,该值乘以1000000。然后,您可以在函数上进行排序。但这并不是理想的性能,但对于这种元风格的db,我不确定还有什么其他方法可以优化它

为了扩展这个功能,你可以为你所有的UM创建一个翻译表,这样它就可以支持其他功能,而不仅仅是大小

因此,作为示例,添加如下表

|Type  |UM |Magnitude|
______________________
|Size  |GB |1000     |
|Size  |MB |1        |
|Size  |TB |1000000  |
|Weight|g  |1        |
|Weight|kg |1000     |
然后让函数查找UM和幅值,然后将其相乘,这样可以始终正确排序


此外,您还可以将属性表更改为指向度量类型,而不是使用该类型;分隔列表。

您也希望它能与MB一起使用,所以我要做的是创建一个函数,将两列值和UM转换为MB结果。因此,对于mb,该函数将该值乘以1,对于gb,该值乘以1000,对于tb,该值乘以1000000。然后,您可以在函数上进行排序。但这并不是理想的性能,但对于这种元风格的db,我不确定还有什么其他方法可以优化它

为了扩展这个功能,你可以为你所有的UM创建一个翻译表,这样它就可以支持其他功能,而不仅仅是大小

因此,作为示例,添加如下表

|Type  |UM |Magnitude|
______________________
|Size  |GB |1000     |
|Size  |MB |1        |
|Size  |TB |1000000  |
|Weight|g  |1        |
|Weight|kg |1000     |
然后让函数查找UM和幅值,然后将其相乘,这样可以始终正确排序



此外,您还可以将属性表更改为指向度量类型,而不是使用该类型;分隔列表。

+1用于建议使用数值。(但您可以更好地格式化代码;))这不能解释Michael提出的情况,他们得到1200vGB,而不是1TB。如果我回忆正确,如果列UM的类型为
enum()
,则顺序将与
enum()
中指定的顺序相同,例如,如果是
enum('B','KB','MB'GB','TB')
,则,然后是“B”<“KB”<“MB”<“GB”<“TB”。Jeff,我真的不明白为什么要写1024MB而不是1GB。我试图为一个简单的问题提供一个简单的解决方案,而不是试图解决度量单位+1导致的建议使用数值的一般问题。(但您可以更好地格式化代码;))这不能解释Michael提出的情况,他们得到1200vGB,而不是1TB。如果我回忆正确,如果列UM的类型为
enum()
,则顺序将与
enum()
中指定的顺序相同,例如,如果是
enum('B','KB','MB'GB','TB')
,则,然后是“B”<“KB”<“MB”<“GB”<“TB”。Jeff,我真的不明白为什么要写1024MB而不是1GB。我试图为一个简单的问题提供一个简单的解决方案,而不是试图解决由度量单位引起的一般问题。在case语句正确之前,您想要value*而不是um*?这很好,但我想使用ATTRIBUTE.um order和TABLE2.value,因为我将有cm;糖尿病;米或克,千克,吨。。。谢谢你,你应该考虑把UM放在它自己的表中,因为你可能不总是想要使用一致间隔的措施。可能需要进行转换,因为获得1200 GB这样的数据并不罕见,需要进行转换才能将其与1进行比较TB@JeffBeck谢谢你指出乘法表达式非常感谢Michael Buen,我感谢你的最终答案!在case语句正确之前,您需要value*而不是um*?这很好,但我想使用ATTRIBUTE.um order和TABLE2.value,因为我将使用cm;糖尿病;米或克,千克,吨。。。谢谢你,你应该考虑把UM放在它自己的表中,因为你可能不总是想要使用一致间隔的措施。可能需要进行转换,因为获得1200 GB这样的数据并不罕见,需要进行转换才能将其与1进行比较TB@JeffBeck谢谢你指出乘法表达式非常感谢Michael Buen,我感谢你的最终答案!