2

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

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

所以使用$json_order我需要迭代下表,但在其中的 Order 中返回结果$json_order

SELECT id, name
FROM  `module_category` 

谁能告诉我这样做的好方法?

4

6 回答 6

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.' )';

更新:对不起,我上面的代码有一个错误,现在已经更正了:-)

于 2013-03-19T15:40:33.800 回答
2

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

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

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

于 2013-03-19T15:40:41.437 回答
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.

于 2013-03-19T15:50:27.153 回答
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).');';
于 2013-03-19T15:38:27.380 回答
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 操作,您可以按顺序获取所有内容。

于 2013-03-19T15:40:41.157 回答
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

于 2013-03-19T15:45:00.717 回答