私のテーブルレイアウトの簡略版は次のとおりです。
テーブルアイテム
+----+-------+-----+
| ID | sdesc | ... |
+----+-------+-----+
| 1 | item1 | ... |
+----+-------+-----+
table itemaffectTable (数量のあるプロパティについては、これらの qProps を呼び出します)
+--------+---------+----------+
| itemID | affectID| quantity |
+--------+---------+----------+
| 1 | 2 | 10 | // item 1 has affect 2 for a value of 10
| 1 | 3 | 2 | // item 1 has affect 3 for a value of 2
| 2 | 1 | 5 | // item 2 gets aff 1 for 5
| 2 | 1 | 6 | // item 2 gets aff 1 for 6 which means 11 total
| 3 | 5 | 5 |
+--------+---------+----------+
table itemaffectbyTable (存在する場合は関連するこれらの bProps を呼び出します)
+--------+---------+
| itemID | affbyID |
+--------+---------+
| 1 | 6 |
| 3 | 2 |
| 3 | 3 |
+--------+---------+
出力例:
itemID sdesc qpropID value bpropID
1221 a copper lantern 4 2 5
1221 a copper lantern 18 2 5
1221 a copper lantern 17 -5 5
477 a shade 19 3 4
477 a shade 19 3 6
これは 2 つの点で正しくありません。最初のアイテムでは、affectbyID 5 が 3 回繰り返されます...これは許容範囲です。2 番目のケースでは、影響 ID 19 と影響値 3 が 2 回繰り返されていますが、これは許可されていません。
理想的には見たい
itemID sdesc qpropID value bpropID
1221 a copper lantern 4 2 5
1221 a copper lantern 18 2 NULL
1221 a copper lantern 17 -5 NULL
477 a shade 19 3 4
477 a shade NULL NULL 6
主な問題は、qpropID と値が加算されるため、それらが繰り返されることです。ソリューションが bpropID を繰り返す場合、大した問題ではありません。
** アップデート **
FULL JOIN のアイデアを使用して結果を取得しようとしましたが、ゼロにできなかったようです。
私が望む結果に最も近いのは、sqlFiddleを使用して取得したことです
select i.id, i.sdesc, iaft.affectID, iaft.amount, NULL FROM item i
LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
UNION
select i.id, i.sdesc, NULL, NULL, iafbt.affectbyID FROM item i
LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
ORDER BY id
要点は、フィルタの基準を満たすアイテムのリストを取得し、それらのアイテムを関連するeffectIDおよびaffectbyIDと照合することです。
オリジナルは以下。
SELECT DISTINCT i.id, i.sdesc, iaft.affectID, iaft.amount, iafbt.affectbyID FROM item i
INNER JOIN itemwearTable iwt ON i.id=iwt.itemID
LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
LEFT JOIN itemalignTable iat ON i.id = iat.itemID
LEFT JOIN itemgenderTable igt ON i.id = igt.itemID
LEFT JOIN itemgenreTable igrt ON i.id = igrt.itemID
LEFT JOIN itemclassTable ict ON i.id = ict.itemID
LEFT JOIN itemraceTable irt ON i.id = irt.itemID
WHERE (iat.itemID IS NULL OR iat.alignID = 1)
AND (igt.itemID IS NULL OR igt.genderID = 1)
AND (igrt.itemID IS NULL OR igrt.genreID = 1)
AND (ict.itemID IS NULL OR ict.classID = 1)
AND (irt.itemID IS NULL OR irt.raceID = 1)
AND i.minlvl <= 50
AND iwt.wearlocID=1
ORDER BY sdesc