-1

このクエリは、変更するには扱いにくくなりすぎており、かなり非効率的になっていると確信しています。

可変数のプロパティを持つ可能性のあるアイテムのテーブルがあるため、これらのプロパティは小さなテーブルにリストされています...アイテム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 があることですが、それを取得する方法がわかりません。すでにあるものを真剣に台無しにすることなく挿入されます。

どんな助けでも大歓迎です。

4

2 に答える 2

3

私はこれがそれを行うべきだと思います:

SELECT DISTINCT i.*, iwt.* FROM item i
INNER JOIN itemwearTable iwt ON i.id=iwt.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 itemlocTable ilt ON i.id = ilt.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 (ilt.itemID IS NULL OR ilt.locID = 1)
AND i.minlvl <= 50
AND iwt.wearlocID=1
ORDER BY i.sdesc
于 2013-07-23T02:20:21.577 に答える
1

このようなものがうまくいくはずです。

SELECT item.*, itemwearTable.* FROM item
INNER JOIN itemwearTable
  ON (id=itemwearTable.itemID AND itemwearTable.wearlocID=1)
LEFT JOIN itemalignTable
  ON item.id=itemalignTable.itemID
LEFT JOIN itemgenderTable
  ON itemgenderTable.itemID=item.id
LEFT JOIN itemgenreTable
  ON item.id=itemgenreTable.itemid
LEFT JOIN itemclassTable
  ON item.id=itemclassTable.itemid
LEFT JOIN itemlocTable
  ON item.id=itemlocTable.itemid
WHERE (itemalignTable.itemID IS NULL OR itemalignTable.alignID=1)
  AND (itemgenderTable.itemID IS NULL OR itemgenderTable.genderID=1)
  AND (itemlocTable.itemid IS NULL OR itemlocTable.locID=1)
  AND ((itemgenreTable.itemid IS NULL OR itemgenreTable.genreID=1)
      OR (itemclassTable.itemid IS NULL OR itemclassTable.classID=1))
  AND item.minlvl <= 50
ORDER BY item.sdesc
于 2013-07-23T02:27:06.603 に答える