我有一个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`
有人能告诉我这样做的好方法吗?
答案 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