因此,在我的数据库中,我存储乐器名称(和各种其他属性)。假设id
是主键,name
是唯一键。
在PHP脚本中,我按仪器类选择项目,如下所示:
$name = mysql_real_escape_string($_POST['name']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM `instruments` WHERE name LIKE '%$name%' ORDER BY id"));
结果表:
id name
1 "Flute 2"
2 "Bass Flute"
3 "Flute 10"
4 "Flute 7"
这使我可以通过查询“萨克斯管”来选择整个乐器系列,如“Soprano Saxophone”,“Alto Saxophone”等。
在该特定示例中,结果由其id(您可以假设为auto_incremented)引发。更理想的是按字母顺序排序,是吗?
id name
2 "Bass Flute"
3 "Flute 10"
1 "Flute 2"
4 "Flute 7"
这很好,但是作为音乐家,他们喜欢和数据库管理员打成一片,并且不要在长笛结果中选择“长笛”上面的“低音长笛”,并且真的不要在“长笛2”之前列出“长笛10”。
所以,看到没有ORDER BY score_order
(这太容易了,不会......),我怎么能引入某种订购系统来正确显示仪器呢?
通过头脑风暴,我找到了一个解决方案: 我可以添加一个整数类型的列,并根据它们的重要性(即Piccolos将为“1”,Flutes“2”等)对这些工具进行“排名”:
... 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
然而,这并没有考虑到“长笛10”出现在“长笛2”之前,字母数字的事实。
理想的结果表(按rank
排序,然后按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
有没有办法通过分析整个数字而不是按数字来分析SQL订单记录?
答案 0 :(得分:11)
你可以创建一个不同的订单来做这样的事情。这是一个黑客攻击。
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
)
使用id列可能更好。
select * from table
order by (
case id
when 3 then 0
when 1 then 1
when 4 then 2
when 2 then 3
end
)
答案 1 :(得分:1)
我要做的是在表格中添加“优先级”列。然后按最重要的顺序排序(例如基础乐器将是0:长笛,萨克斯等等,修改将是1:低音长笛,中音长笛等,而数字的优先级将是他们的数字+ 100或者其他东西将它们放在结束但仍按数字顺序)。
在数字上对数字进行排序(以及在相同优先级的情况下按字母顺序排序)的最佳方法是使用数字。
编辑:所以,上面会给你这样的东西(优先级在括号中):
长笛(0)
低音长笛(1)
男高音长笛(1)
长笛1(101)
长笛2(102)
长笛10(110)
答案 2 :(得分:1)
对我来说,理想的排序顺序并不完全清楚,但您应该只是在数据库表中添加一个额外的列。您说ORDER BY score_order
太容易了,但为什么不添加明确的score_order
字段并按顺序排序?
答案 3 :(得分:0)
使用MySQL FIELD()函数,如下所示:
SELECT * FROM `instruments` WHERE `name` LIKE '%$name%'
ORDER BY FIELD( `name`,
'Piccolo',
'Flute 2',
'Flute 7',
'Flute 10',
'Alto Flute',
'Bass Flute'
)
[插入"参数化您的查询"这里警告]