2

ここで動的SQLを使用していくつかのルールを破っていることはわかっていますが、それでも質問する必要があります。レコードをプルする必要がある各チケットの一連のタグを含むテーブルを継承しました。

簡単な例...「'Apples'、'Oranges'、'Grapes'」を含む配列があり、配列に含まれるすべてのアイテムを含むすべてのレコードを取得しようとしています

私のSQLは次のようになります:

 SELECT * FROM table WHERE basket IN ( " + fruitArray + " )

もちろん、これは次と同等です。

 SELECT * FROM table WHERE basket = 'Apples' OR basket = 'Oranges' OR basket = 'Grapes'

ORの代わりにANDを使用することを除いて、IN(配列)と同じように機能する関数があるかどうか知りたいので、次と同じ結果を得ることができます。

 SELECT * FROM table WHERE basket LIKE '%Apples%' AND basket LIKE '%Oranges%' AND basket LIKE '%Grapes%'

文字列全体を手動で生成することもできますが、可能であれば、より洗練されたソリューションが必要です。どんな助けでもいただければ幸いです。

4

5 に答える 5

1

これはSQLで非常に一般的な問題です。基本的に2つの解決策があります:

  1. リスト内のすべての行を照合し、それらすべての行に共通の値を持つ列でグループ化し、グループ内の個別の値の数が配列内の要素の数であることを確認します。

    SELECT basket_id FROM baskets
    WHERE basket IN ('Apples','Oranges','Grapes')
    GROUP BY basket_id
    HAVING COUNT(DISTINCT basket) = 3
    
  2. 配列内の個別の値ごとに自己結合を実行します。そうして初めて、1つのWHERE式で複数の行の値を比較できます。

    SELECT b1.basket_id
    FROM baskets b1
    INNER JOIN baskets b2 USING (basket_id)
    INNER JOIN baskets b3 USING (basket_id)
    WHERE (b1.basket, b2.basket, b3.basket) = ('Apples','Oranges','Grapes')
    
于 2011-11-11T00:26:06.207 に答える
0

全文検索ではそのようなことがあるかもしれませんが、一般的に、このような演算子が。との接続詞の外で非常に役立つとは思えませんLIKE

検討:

SELECT * FROM table WHERE basket ='Apples' AND basket = 'Oranges'

常にゼロ行に一致します。

于 2011-11-11T00:20:19.077 に答える
0

あなたbasketの例が示唆するように、が文字列である場合、あなたが得ることができる最も近いものは使用することLIKE '%apples%oranges%grapes%'であり、それはで簡単に構築することができます'%'.implode('%', $tags).'%'

これに関する問題は、「タグ」の一部が他のタグに含まれている可能性があるかどうかです。たとえば、'supercalifragilisticexpialidocious' LIKE '%super%'trueになります。

于 2011-11-11T00:25:14.750 に答える
0

あなたがLIKE比較をする必要があるなら、私はあなたが運が悪いと思います。一致するセットを任意の順序で呼び出して正確な比較を行う場合は、ステートメントのINTERSECTEXCEPTオプションを調べる必要があります。SELECTそれらは少し混乱しますが、非常に強力な場合があります。(区切られた文字列を表形式に解析する必要がありますが、もちろんそれを実行していますね?)

于 2011-11-11T00:25:32.377 に答える
0

あなたが探しているアイテムは、バスケット内で常に同じ順序になっていますか?はいの場合、単一のLIKEで十分です。

SELECT * FROM table WHERE basket LIKE '%Apples%Oranges%Grapes%';

また、配列を%区切り文字で文字列に連結するのは簡単です。

于 2011-11-11T00:25:50.453 に答える