2

チャームのように機能するクエリがありますが、現在GROUP_CONCAT作成されているフィールドにある値でフィルタリングする必要があります。HAVINGを使用してフィルタリングできることを学びましたが、6、16、26HAVING groupconcatname LIKE '%6%'などを見つけるために使用する構文が見つかりません。ステートメント内で「8」を見つけることができるように、特定の値を検索する必要があります。 groupconcatを含み、 8 AND 18 AND 581,5,8,18,30,58が見つからないのは、LIKE'%%'を使用したためです。

私のクエリ(現在は機能しますが、の部分一致に基づいて結果が多すぎます%6%):

SELECT offers.*, s.short_name AS sponsorName, s.logo AS sponsorLogo, GROUP_CONCAT( mn.title) titles, 
   GROUP_CONCAT( mo.`name`) metas, GROUP_CONCAT( om.meta_option) AS meta_ids
FROM offers 
INNER JOIN offer_metas as om ON om.offer_id = local_ld_offers.id 
INNER JOIN meta_options as mo ON om.meta_option = mo.id 
INNER JOIN meta_names as mn ON mo.category = mn.category AND mo.cat_seq = mn.seq 
LEFT JOIN sponsors AS s ON s.id=offers.sponsor 
GROUP BY offers.id 
HAVING meta_ids LIKE '%6%'
ORDER BY end_date ASC

私はHAVING meta_ids LIKE '%6%'もっ​​と似たものに置き換える必要がありますが、HAVINGステートメントを置き換えようとすると、 WHEREWHERE '6' IN meta_idsが機能するのに合理的な試みのように見えますが、それは私の句で使用する有効な変数/フィールドであるという事実を無視し、エラーになります。meta_ids

何かお勧めはありますか?

ありがとう、

シルバータイガー

更新-よりエレガントな方法がない限り解決

以下のThomasの推奨事項に基づいて、クエリを更新しました。次のように更新されたメソッドを使用してオプションごとに行を追加することで、必要な数の個別の値を検索できるようです。

WHERE EXISTS( SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '23')
OR EXISTS( SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '16')
4

2 に答える 2

3

ここで何が求められているのかは明確ではありませんが(期待される出力を備えたいくつかのテスト入力が役立つでしょう)、Having句が本当に必要なようには思えません。sayが"like"8である値をフィルタリングする場合はom.meta_option、次のようなWhere句を追加します。

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option = Like '%8%'
                )

もちろん、これは、、、およびが存在する行を8返します。に等しい特定の値を探している場合は、次を使用します。80181818

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option = '8'
                )

求めるものが一連の値である場合、次のようなことができます。

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option In('8','23')
                )

グループ化の後にフィルターを適用するHaving句と、グループ化の前にフィルターを適用するWhere句の目的を忘れないでください。この場合、フィルタリングはグループ化の前に行う必要があるように思われるため、Where句を使用する必要があります。

于 2012-04-27T04:17:04.237 に答える
0

あなたはあなたが探しているものを手に入れるべきものに変えることができHAVING meta_ids LIKE '%6%'ます。HAVING meta_ids LIKE '%,6,%' OR '6,%' OR '%,6' OR '6'

代替案には、サブクエリのようなものが含まれます。たとえば、%演算子はパフォーマンスの面であまり優れていません。

于 2012-04-27T03:58:45.240 に答える