Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按任意顺序排序SQL行输出?_Php_Mysql_Sql_Sorting - Fatal编程技术网

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

Php 按任意顺序排序SQL行输出?,php,mysql,sql,sorting,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")); SELECT * FROM `inst

因此,在我的数据库中,我存储乐器名称(以及各种其他属性)。假设
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"));
SELECT * FROM `instruments` WHERE `name` LIKE '%$name%'
ORDER BY FIELD( `name`,
    'Piccolo',
    'Flute 2',
    'Flute 7',
    'Flute 10',
    'Alto Flute',
    'Bass Flute'
)
结果表:

id    name
1     "Flute 2"
2     "Bass Flute"
3     "Flute 10"
4     "Flute 7"
这让我可以通过查询“萨克斯管”来选择整个乐器系列,如“女高音萨克斯管”、“中音萨克斯管”等

在该特定示例中,结果按其id(您可以假设该id是自动递增的)进行排序。更理想的是按字母顺序排序,是吗

id    name
2     "Bass Flute"
3     "Flute 10"
1     "Flute 2"
4     "Flute 7"
这很好,但作为音乐家,他们喜欢和DB管理员鬼混,不喜欢在长笛结果中“长笛”上面列出“低音长笛”,也不喜欢在“长笛2”之前列出“长笛10”

所以,既然没有按分数排序的
(那太容易了,不是吗…),我该如何引入某种排序系统来正确显示仪器呢

经过头脑风暴,我想出了一个解决方案: 我可以再添加一列integer类型,并根据乐器的重要性对乐器进行“排序”(即,皮科罗为“1”,长笛为“2”,等等):

然而,这并不能解释“长笛10”在“长笛2”之前的事实,字母数字

理想结果表(按
rank
排序,然后按
name
排序):

有没有一种方法可以通过分析整个数字而不是逐个数字来获取SQL订单记录?

我要做的是在表中添加一个“优先级”列。然后按最重要的顺序排列(例如基本乐器为0:长笛、萨克斯管等,修改为1:低音长笛、中音长笛等,数字的优先级为数字+100或将其放在末尾但仍按数字顺序排列)

对数字进行数字排序(在优先级相同的情况下按字母顺序排序)的最佳方法是使用数字

编辑:所以,上面会给你这样的东西(优先权在parentheis):
长笛(0)
低音长笛(1)
男高音长笛(1)
长笛1(101)
长笛2(102)

长笛10(110)

我并不完全清楚理想的排序顺序是什么,但您可能应该在数据库表中增加一列。你说按分数排序太容易了,但是为什么不添加一个明确的
score\u ORDER
字段并按该字段排序呢?

你可以创建一个不同的顺序,这样做。这是一个黑客

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
)
使用MySQL FIELD()函数,如下所示:

$name = mysql_real_escape_string($_POST['name']);
$row = mysql_fetch_row(mysql_query("SELECT * FROM `instruments` WHERE name LIKE '%$name%' ORDER BY id"));
SELECT * FROM `instruments` WHERE `name` LIKE '%$name%'
ORDER BY FIELD( `name`,
    'Piccolo',
    'Flute 2',
    'Flute 7',
    'Flute 10',
    'Alto Flute',
    'Bass Flute'
)

[在此处插入“参数化您的查询”警告]

这是一个好的观点。理想情况下,这些乐器将被列为:长笛1长笛2长笛3中音长笛低音长笛。。。按
score\u order
字段排序仍然是字母数字,这不是我想要的。我在问题后面附加了一些示例表,以便您能够更好地可视化它。谢谢:)您不能将
score\u order
设置为数字字段而不是字母数字字段吗?(我假设
score\u order
是乐器在乐谱中出现的顺序;我是否误解了?)当您需要更改此顺序时,会出现问题;在一些常见的情况下,许多项目必须更改订单号才能插入。因此,如果我按string类型排序,MySQL会按字母数字顺序排列,但如果按类型排序的列是integer,则不会这样做?有趣的。。。然而,要在工作中使用扳手,需要将数字集成到结果集中,这样所有的“长笛”都在一起,所有的“中音长笛”都在一起,与数字无关。你是设置优先级的人,因此你可以设置优先级,让它按照你喜欢的方式进行排序。在您的查询中,您只需输入“按优先级排序ASC,命名ASC”,这不是一个黑客行为,这是一个可靠的策略!有时,如果您正在查询一个不能(或不应该)修改的数据库,那么它是最好的选择。另一个类似的想法是创建某种临时表来保存InstrumentID和首选顺序,然后只连接到该临时表。