2

MySQL クエリで迷っています (実行中MySQL 5.0.88)

私は 2 つのテーブルを持っています。1 つはproductsfrom differentbrandsで、もう 1 つはapplications(= アプリケーションは製品をフィルタリングするため、すべてのアプリケーションがすべての製品を表示するわけではありません)。

ユーザーが実行しているアプリケーションに応じて、ブランドのリストを取得するためにクエリを実行しようとしています。

SELECT    p.brand_name
        , p.id
        , p.seller_id
        , a.seller_id
        , a.info  
        , a.name
        , a.application_match_keys  

    FROM  applications AS a 
    LEFT JOIN products AS p
        ON a.seller_id = p.seller_id    
        AND p.brand_name IN ( <<QueryString: application_match_keys>> )

    WHERE  p.active = "1"
    AND    a.seller_id = "2222222222222"

    GROUP BY p.brand_name
    ORDER BY p.brand_name ASC 

問題は、一度実行するleft joinと正しい結果が得られなくなることです。たとえば、次のようになります。

=== products ===
id        brand_name  seller_id
123       A           John
111       A           John
124       A           John
999       B           John
xx1       C           John

=== applications ===
name    seller_id   info  application_match_keys
red     John        foo   A
blue    John        bar   B,C

ユーザーがアプリケーション A を使用している場合、ブランド リストには、対応する match_keys (= A) を持つアクティブな製品のブランドのみが含まれている必要があるため、クエリが返されると予想されます。

p.brand_name  application   info
A             red           foo

しかし、次のように、アプリケーション データが一致しない正しいブランド名を常に取得しています。

p.brand_name  application   info
A             blue          bar

質問:
単一のクエリでこれをクエリする方法はありますか? または、active products' brands with matching application key最初にクエリを実行してから、必要なアプリケーション データを取得するために再度ループ/クエリを実行する必要がありますか? 単一のクエリでも可能である必要がありますか?

手伝ってくれてありがとう!

編集:
わかりました。これがどのように機能するかです:

SELECT    p.brand_name
        , p.id
        , p.seller_id
        , a.seller_id
        , a.info  
        , a.name
        , a.application_match_keys 

FROM  applications AS a 
LEFT JOIN products AS p
    ON a.seller_id = p.seller_id
    AND p.brand_name IN ( <<QueryString: application_match_keys>> )
    AND FIND_IN_SET( a.application_match_keys, <<QueryString: application_match_keys>>) <> 0    

WHERE  p.active = "1"
AND    a.seller_id = "2222222222222"

GROUP BY p.brand_name
ORDER BY p.brand_name ASC 

どうもありがとうございました!

4

1 に答える 1

1

を使用してはFIND_IN_SETどうですか?

AND FIND_IN_SET(p.brand_name, a.application_match_keys) <> 0
于 2012-11-29T06:57:21.903 に答える