2

以下のようなJSON文字列を保持するPHP変数があります。各番号は、 MySQLテーブルidからのものです。module_category

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

したがって、$json_orderIを使用して以下の表を繰り返す必要がありますが、結果はにある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"]';
$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

これが私の解決策です。

        $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

これを試して:

$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 に答える