SQL查询按ID分类,具有预定义的名称

时间:2014-01-14 16:18:56

标签: 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

我想通过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

2 个答案:

答案 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个国家,我也会创建另一个表并加入。