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

Jul*_*Lam 3 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"));
Run Code Online (Sandbox Code Playgroud)

结果表:

id    name
1     "Flute 2"
2     "Bass Flute"
3     "Flute 10"
4     "Flute 7"
Run Code Online (Sandbox Code Playgroud)

这让我可以通过查询"萨克斯风"来选择整个乐器系列,如"Soprano Saxophone","Alto Saxophone"等.

在该特定示例中,结果由它们的id(您可以假设为auto_incremented)引发.更理想的是按字母顺序排序,是吗?

id    name
2     "Bass Flute"
3     "Flute 10"
1     "Flute 2"
4     "Flute 7"
Run Code Online (Sandbox Code Playgroud)

这样做很好,但作为音乐家,他们喜欢和数据库管理员打成一片,并且不要在长笛的结果中对"长笛"上面列出的"低音长笛"表示友善,并且真的不善待"长笛10"在"长笛2"之前列出.

因此,看到没有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
Run Code Online (Sandbox Code Playgroud)

然而,这并没有考虑到"长笛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
Run Code Online (Sandbox Code Playgroud)

有没有办法通过分析整个数字而不是数字来获取SQL订单记录?

Yad*_*ada 15

你可以创建一个不同的订单来做这样的事情.这是一个黑客.

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
)
Run Code Online (Sandbox Code Playgroud)

使用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
)
Run Code Online (Sandbox Code Playgroud)

  • 这不是黑客攻击,而是可靠的策略!有时,如果您正在查询无法(或不应该)修改的数据库,那么它是最佳选择。另一个类似的想法是创建某种临时表来保存 InstrumentID 和首选顺序,然后加入到该临时表中。 (2认同)

Sim*_*son 1

我并不完全清楚您理想的排序顺序是什么,但您可能应该将其作为数据库表中的额外列。你说ORDER BY score_order这太简单了,但为什么不添加一个显式score_order字段并按其顺序呢?