次の関連フィールドを持つ 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 構文がどこかずれていると考えられます。何か案は?