我有以下SQL表
ID | country_id | name
1 33 test1
2 77 test3
3 33 test5
4 1 test6
5 77 test7
6 33 test8
我想通过country_id对此进行排序,其中每个country_id都有自己的名称(但不在其他数据库中)。
EX:
$countries = array(
77 => 'Macedonia',
33 => 'Uruguay',
1 => 'Ghana'
);
所以结果会是这样的:
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
答案 0 :(得分:1)
您将对MySQL的FIELD()
函数感兴趣,该函数允许您定义自定义ORDER BY
查询:
SELECT
id, country_id, name
FROM
countries
ORDER BY
FIELD(country_id, 77, 33, 1);
FIELD()
允许您定义“有序列表”,然后检查列表中您传入的值所在的索引/位置;您可以使用它来生成自定义ORDER BY
。
如果您在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;
我会推荐后一种方法,因为它更便携。
答案 1 :(得分:1)
您需要使用$countries
数组,对其进行排序并在ORDER BY
中使用它:
sort($countries);
$order = implode(', ', array_keys($countries));
现在,数组按值排序,您可以将这些键用作FIELD()
中的顺序,如 newfurniturey 所示:
SELECT id, country_id, name
FROM countries
ORDER BY FIELD(country_id, $order);
然而,即使只有3个国家,我也会创建另一个表并加入。