按任意顺序排序SQL行输出?

时间:2010-02-05 22:12:24

标签: php mysql sql sorting

因此,在我的数据库中,我存储乐器名称(和各种其他属性)。假设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订单记录?

4 个答案:

答案 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'
)

[插入"参数化您的查询"这里警告]