我有一个 PHP 变量,它包含一个如下所示的 JSON 字符串,每个数字都是id
来自module_category
MySQL 表
$json_order = '["8","2","7","3","1","6","4","5"]';
所以使用$json_order
我需要迭代下表,但在其中的 Order 中返回结果$json_order
。
SELECT id, name
FROM `module_category`
谁能告诉我这样做的好方法?
您可以使用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.' )';
更新:对不起,我上面的代码有一个错误,现在已经更正了:-)
获取ID列表并雕刻以下内容
SELECT id,name FROM `module_category` ORDER BY
FIELD(id,8,2,7,3,1,6,4,5);
FIELD 函数返回每个值的索引位置。你用它来订购。
您应该按如下方式使用 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
.
这是我的解决方案;
$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).');';
$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 操作,您可以按顺序获取所有内容。
试试这个:
$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