2

次の関連フィールドを持つ 1 つのテーブル (ステージングと呼ばれます) があります。

id (PRIMARY)
bundle_id (INT)
product (enum H,L,D)
bundle_code (enum 10,20)

bundle_code が 10 の bundle_id を検索し、同じ bundle_id で product = H の他のレコードと、同じ bundle_id で product != H のレコードを最大 2 つ取得する必要があります。これを実行しようとしています。すべて 1 つのクエリで、bundle_id ごとに 1 つの行を返します。そのため、bundle_id のリストがあり、それぞれにその bundle_id に関連付けられたすべての製品と ID が含まれています。

私が思いついた最高のものはこれです:

SELECT e1.bundle_id AS b_id, e1.product AS prod, e1.id AS id, 
e2.bundle_id AS b2_id, e2.product AS prod2, e2.id AS id2,
e3.bundle_id AS b3_id, e3.product AS prod3, e3.id AS id3,
e4.bundle_id AS b4_id, e4.product AS prod4, e4.id AS id4,    
FROM `staging` AS e1
INNER JOIN `staging` AS e2 ON (e1.bundle_id = e2.bundle_id AND e1.id != e2.id)
INNER JOIN `staging` AS e3 ON (e2.bundle_id = e3.bundle_id AND e2.id != e3.id)
INNER JOIN `staging` AS e4 ON (e1.bundle_id = e4.bundle_id AND e3.id != e4.id)
WHERE e1.bundle_code = '10'
AND e2.bundle_code = '20'
AND e2.product = 'H'
AND e3.product != 'H'
AND e4.product != 'H'

合計結果が 4 つある場合、これは正常に機能しているように見えますが、結果が 3 つある場合は、1 つのデータ セットが重複しています (この場合は ID 1691)。

b_id    prod    id      b2_id   prod2   id2     b3_id   prod3   id3     b4_id   prod4   id4
208768  NULL    1691    208768  H       1692    208768  NULL    1691    208768  L       1693

これを防ぐために追加の WHERE 句を追加すると、代わりにゼロ行が返されるため、JOIN 構文がどこかずれていると考えられます。何か案は?

4

1 に答える 1