0

作成した親パスを使用して、カテゴリ テーブルから結果を取得しようとしています。手動データでリクエスト WHERE IN を起動すると、完全に機能しています。サブクエリを使用して同じリクエストを動的に試行すると、予想される 4 つの結果ではなく、1 つの結果しか得られませんでした。理由がわかりません、助けてもらえますか?

http://sqlfiddle.com/#!2/88b68/6

/*Working query*/
SELECT t.id_categorie FROM t 
WHERE t.id_categorie IN (1396,1399,1403,1412)

/*Not working by subquery ??*/
SELECT cat.id_categorie FROM t as cat
WHERE 
cat.id_categorie IN (SELECT REPLACE(t.path,'.',',') FROM t WHERE t.id_categorie = 1412)

よろしくお願いします。

よろしく、

4

2 に答える 2

1

コンマで区切られたリストを使用inしても、目的は達成されません。サブクエリを使用する場合でも。これを試すことができます:

SELECT cat.id_categorie
FROM t cat
WHERE EXISTS (SELECT 1
              FROM t
              WHERE t.id_categorie = 1412 AND
                    find_in_set(cat.id_categorie, REPLACE(t.path, '.', ',')) > 0
             );

あなたのデータがどのように見えるか、またはこのクエリが何をしているのかさえわかりません(サブクエリが外部クエリと同じテーブルにあるのは奇妙に思えます)。ただし、通常は、区切られたリストではなくテーブルに格納する必要があります。ご覧のとおり、SQL にはリスト用の組み込みのデータ構造があります。テーブルといいます。

于 2014-06-13T11:41:22.693 に答える
1

これが機能しない理由は、インナーが 4 つの個別の整数ではなくSELECT、単一のカンマ区切りの を生成するためです。VARCHAR

find_in_setMySQLでは、次のように を使用できます。

SELECT cat.id_categorie FROM t as cat
WHERE find_in_set(cat.id_categorie, (
  SELECT REPLACE(t.path,'.',',')
  FROM t WHERE t.id_categorie = 1412))

私がしたことはIN、クエリの式を への呼び出しに置き換え、find_in_set他のすべてを同じままにすることでした。

デモ

ただし、このソリューションには根本的な欠陥があります。1 つの列に複数の値を格納して多対多の関係を表すからです。この要件を実装するためのより良い方法は、テーブルの行を関連する行に接続する別のテーブルを使用することです。

于 2014-06-13T11:46:16.097 に答える