2

これに関連する多くの質問がありますが、内部結合を使用するという同じ答えがすべてあります。これは(私が思うに)ここでは不可能です。(間違っていたら言ってください)

私が今していることは、2 つの異なる mysql クエリを呼び出して結果を取得することです。それは完全に機能します。

$db->query("SELECT * FROM `meta` WHERE `metakey` = 'category_order'");
$order = $db->fetch_assoc()['metavalue'];  
/*$order = 2,1,12,11,10*/

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, $order)");           
$cats = $db->fetch();

クエリの数を減らすために、次のようなものを試しました。

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, (SELECT 'metavalue' FROM `meta` WHERE `metakey` = 'category_order'))");

エラーは表示されませんが、間違った出力が得られます。これを行う方法はありますか?

編集

カテゴリ テーブルの構造、

_________________
| ID  | name    |
-----------------
| 1   | A       |
| 2   | B       |
| 11  | C       |
| 12  | D       |
| 10  | E       |
-----------------

メタテーブルの構造、

______________________________________
| ID | metakey        | metavalue    |
--------------------------------------
| 1  | category_order | 2,1,12,11,10 |
--------------------------------------
4

2 に答える 2

1

列を文字列リテラルに変換するため、GROUP_CONCATmetavalueを一重引用符で囲まないでください。

$db->query("SELECT * FROM `categories` WHERE `parent` = '0' ORDER BY field(ID, (SELECT GROUP_CONCAT(`metavalue`) FROM `meta WHERE `metakey` = 'category_order'))");
于 2013-03-12T13:12:34.753 に答える
1

ORDER BY FIELD を直接使用してそれを行う方法が実際にはわかりません。

ただし、メタ テーブルに対して JOIN を実行してから、FIND_IN_SET で ORDER BY を実行できるかどうか疑問に思っています。

これはテストされていませんが、うまくいけばアイデアが得られます:-

SELECT * 
FROM `categories` 
INNER JOIN meta ON metakey = 'category_order' AND FIND_IN_SET(categories.ID,metavalue)
WHERE `parent` = '0' 
ORDER BY FIND_IN_SET(categories.ID,metavalue)

おそらく、JOIN の FIND_IN_SET は必要ありません

于 2013-03-12T14:07:40.357 に答える