Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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 按id排序的SQL查询';具有预定义名称的_Php_Mysql_Sorting_Select - Fatal编程技术网

Php 按id排序的SQL查询';具有预定义名称的

Php 按id排序的SQL查询';具有预定义名称的,php,mysql,sorting,select,Php,Mysql,Sorting,Select,我有下面的SQL表 ID | country_id | name 1 33 test1 2 77 test3 3 33 test5 4 1 test6 5 77 test7 6 33 test8 我想按国家编号订购,每个国家编号都有自己的名称(但不在另一个数据库中) 例: 结果是这样的:

我有下面的SQL表

ID  |   country_id  |   name
1       33           test1
2       77           test3
3       33           test5
4       1            test6
5       77           test7
6       33           test8
我想按国家编号订购,每个国家编号都有自己的名称(但不在另一个数据库中)

例:

结果是这样的:

 ID    |   country_id         |  name
 4         1  (G hana)        test6
 2         77 (M acedonia)    test3
 5         77 (M acedonia)    test7
 1         33 (U ruguay)      test1
 3         33 (U ruguay)      test5
 6         33 (U ruguay)      test8

您将对MySQL的函数感兴趣,该函数允许您通过查询定义自定义的
订单:

SELECT
    id, country_id, name
FROM
    countries
ORDER BY
    FIELD(country_id, 77, 33, 1);
FIELD()
允许您定义“有序列表”,然后检查您传入的值在列表中的索引/位置;您可以使用它通过
生成自定义的
订单

如果您有一个PHP数组,如您在
$countries
中所示,您可以使用以下命令轻松生成查询:

$country_ids = join(',', array_keys($countries));
$fieldClause = 'FIELD(country_id, ' . $country_ids . ');'
或者,如果您有第二个包含国家名称的参考表,您可以
JOIN

SELECT
    a.id, a.country_id, a.name
FROM
    your_table a
    JOIN countries c
        on a.country_id = c.id
ORDER BY
    c.name;

我建议使用后一种方法,因为它更便于携带。

您需要使用
$countries
数组,对其进行排序,并按
的顺序使用它:

sort($countries);
$order = implode(', ', array_keys($countries));
现在数组按值排序,您可以使用键作为
字段()
中的顺序,如newfurnity所示:

SELECT id, country_id, name
FROM countries
ORDER BY FIELD(country_id, $order);

但是,即使只有3个国家,我也会创建另一个表并加入其中。

您没有将国家id映射到您要订购的国家名称的表吗?若否,原因为何?若国家名称只存在于应用程序代码中,那个么我将把排序留给应用程序。否则,您将得到一个紧密耦合、脆弱的解决方案,尝试根据其他地方存在的某些国家/地区映射按DB排序。不,我没有其他表。我不能创建一个。如果可以的话,为什么还要在数据库中有一个国家id;你没有另一个表可以将这些id映射到有用的东西吗?若您可以修改此表的架构,或许只需将id替换为国家名称即可。我也觉得奇怪,你不能创建一个表。如果有人想让你做这项工作并实现这项功能,他们需要允许你潜在地更改模式。我只有三个国家类型可以随时更改,所以我不明白为什么我应该只为三个表构建一个表。好吧,但是它怎么知道77是马其顿的,33是乌拉圭的等等。此外,必须根据ID的指定名称自动进行排序。@TudorRavoiu您说过您有一个预定义的列表;如果没有关系表,则必须进行一些硬编码(即,按照关系表的顺序编写)。我已经更新了我的答案,以展示一个快速的示例,如果有帮助的话,您可以使用示例
$countries
数组来使用PHP。
SELECT id, country_id, name
FROM countries
ORDER BY FIELD(country_id, $order);