根据变量中ID的顺序获取MySQL结果

时间:2013-03-19 15:33:43

标签: php mysql

我有一个PHP变量,它包含如下所示的JSON字符串,每个数字都是id MySQL表中的module_category

$json_order = '["8","2","7","3","1","6","4","5"]';

所以使用$json_order我需要迭代下面的表格,但是在$json_order所在的订单中返回结果。

SELECT id, name
FROM  `module_category` 

有人能告诉我这样做的好方法吗?

6 个答案:

答案 0 :(得分:4)

您可以使用FIELD()功能,该功能用于自定义排序,正如您所需,您可以像这样使用它:

//Convert $json_order into '8','2','7','3','1','6','4','5' to insert it in sql
$order = str_replace(array('"','[',']'), array("'",'',''), $json_order);
$sql = 'SELECT id, name
FROM  `module_category` ORDER BY FIELD(id, '.$order.' )';

更新:抱歉,我的上述代码出现了错误,现在已更正: - )

答案 1 :(得分:2)

获取ID列表并雕刻以下内容

SELECT id,name FROM `module_category` ORDER BY
FIELD(id,8,2,7,3,1,6,4,5);

FIELD function返回每个值的索引位置。你用它来订购。

答案 2 :(得分:2)

您应该按如下方式使用FIELD:

$order = trim('["8","2","7","3","1","6","4","5"]', '[]');

$query = "SELECT id, name FROM  `module_category`
          ORDER BY IF (FIELD(id, $order), 0, id), FIELD(id, $order)";

请注意,在这种情况下使用IF非常重要,否则FIELD将返回0所有不在列表中的结果,使其显示在顶部。我们只是反转了这种行为:现在,对于id在列表中的每一行,我们返回0 - 这会使这些行排在最前面,然后按id排序。

答案 3 :(得分:1)

这是我的解决方案;

        $json_order = '["8","2","7","3","1","6","4","5"]';
        $decoded = json_decode($json_order);
        echo 'SELECT id, name FROM `table` WHERE `id` IN ('.implode(',', $decoded).') ORDER BY FIELD(id,'.implode(',', $decoded).');';

答案 4 :(得分:1)

$json_order = '["8","2","7","3","1","6","4","5"]';
$a=json_decode($json_order,"true");
$sql="SELECT id, name
FROM  `module_category`
ORDER BY FIELD (id,".implode(",",$a).")";

所以基本上你拿JSON,把它转换成一个数组,然后将其内联为逗号分隔。然后使用SQl的Field操作,您可以按顺序获取所有内容。

答案 5 :(得分:1)

试试这个:

$sql=SELECT id, name FROM  `module_category`
 ORDER BY FIELD(id, 8,2,7,3,1,6,4,5), json_order;

阅读http://www.electrictoolbox.com/mysql-order-specific-field-values/http://lists.mysql.com/mysql/209784