このクエリは、変更するには扱いにくくなりすぎており、かなり非効率的になっていると確信しています。
可変数のプロパティを持つ可能性のあるアイテムのテーブルがあるため、これらのプロパティは小さなテーブルにリストされています...アイテムIDとプロパティIDは通常インデックスを構成し、プロパティテーブルには追加情報があります。本質的に、それらは膨大な数のアイテムを少なくとも関連するサブセットにフィルタリングするために使用されます。
SELECT * FROM item
INNER JOIN itemwearTable
ON (id=itemwearTable.itemID AND itemwearTable.wearlocID=1)
WHERE item.id IN (
SELECT id FROM item
LEFT JOIN itemalignTable
ON item.id=itemalignTable.itemID
WHERE
itemalignTable.itemID IS NULL OR
(itemalignTable.itemID=item.id AND itemalignTable.alignID=1)
)
AND
item.id IN (
SELECT id FROM item
LEFT JOIN itemgenderTable
ON itemgenderTable.itemID=item.id
WHERE
itemgenderTable.itemID IS NULL OR
(itemgenderTable.itemID=item.id AND itemgenderTable.genderID=1)
)
AND
(item.id IN (
SELECT id FROM item
LEFT JOIN itemgenreTable
ON item.id=itemgenreTable.itemid
WHERE
itemgenreTable.itemid IS NULL OR
(itemgenreTable.itemID=item.id AND itemgenreTable.genreID=1)
)
OR
item.id IN (
SELECT id from item
LEFT JOIN itemclassTable
ON item.id=itemclassTable.itemid
WHERE
itemclassTable.itemid IS NULL OR
(itemclassTable.itemID=item.id AND itemclassTable.classID=1)
))
AND
item.id IN (
SELECT id from item
LEFT JOIN itemlocTable ON
item.id=itemlocTable.itemid
WHERE
itemlocTable.itemid IS NULL OR
(itemlocTable.itemID=item.id AND itemlocTable.locID=1)
)
AND
item.minlvl <= 50
ORDER BY item.sdesc
通常、クエリを生成するスクリプトの一部である php 変数を置き換えるために、ここでは多くの場所で =1 を使用していることに注意してください。問題は、これらのアイテムが結果を絞り込むために使用されている間、item.id=itemaffTable.itemID に一致する追加のデータ (たとえば、金額) を持つ別のテーブル itemaffTable があることですが、それを取得する方法がわかりません。すでにあるものを真剣に台無しにすることなく挿入されます。
どんな助けでも大歓迎です。