2

助けが必要になってからしばらく経ちましたが、今日は基本的にあなたの知識から助けを得るためにここにいます. 私は現在、次の非常に厄介な SQL の問題にかなり悩まされています。

私は2つのテーブルを持っています。ペイントアイテム、スペシャルアイテム。両方のテーブルには一意の列名 (painteditemid、specialitemid など) がありますが、両方のテーブルは同様の値を共有しています。両方のテーブルから結果を取得したい。

これが私のセットアップだとしましょう:

塗装済みアイテム

  • 塗装済みアイテム名
  • ペイントされたアイテムの色
  • 見える

スペシャルアイテム

  • 特別なアイテム名
  • specialItemColor
  • 見える

私はこのクエリを使用しました:

SELECT *
FROM `painteditems` AS pa,
     `specialitems` AS sp
WHERE (pa.`visible` = 1
       OR sp.`visible` = 1)
  AND (pa.`painteditemname` = 'itemname1'
       OR sp.`specialitemname` = 'itemname1')
  AND (pa.`painteditemcolor` = 'black'
       OR sp.`specialitemcolor` = 'black')

その結果、次のようになりました。

Showing rows 0 - 29 ( 259,040 total, Query took 39.4352 sec)

両方のテーブルには合計で 10.000 行しか含まれていません。これを追加しても何もしませんでした:

GROUP BY pa.`painteditemid`, sp.`specialitemid`

それでも26万行。これにどのようにアプローチすればよいですか?

前もって感謝します。

編集: 固定間隔、コード ブロック

4

3 に答える 3

7

UNION確かに、2 つのテーブルの間に必要なように聞こえます。現在、デカルト積を取得しているため、結果が非​​常に大きくなっています。

select *, 'painted' Source
from painteditems
where visible = 1
    and painteditemname = 'itemname1'
    and painteditemcolor = 'black'
union all
select *, 'special' Source
from specialitems
where visible = 1
    and specialitemname = 'itemname1'
    and specialitemcolor = 'black'

SELECT *を列名に置き換える必要があります。また、両方のクエリで列数とデータ型が一致している必要があります。

UNION ALL行のみが必要な場合は、両方のテーブルからすべての行を返しDISTINCTます。UNION

于 2013-01-31T15:52:39.747 に答える
0

union allサブクエリで a を使用してこれを行います。

select *
from ((select paintedItemName as ItemName, paintedItemColor as ItemColor, visible, 'Painted' as which
       from painteditems
      ) union all
      (select specialItemName, SpecialItemColor, visible, 'Special' as which
       from specialitems
      )
     ) t
where visible = 1 and itemname = 'itemname1' and itemcolor = 'black'

これにより、結果のセットを 1 つだけ持つことができます。ではunion、列名は最初のサブクエリから取得され、これにより、より一般的な名前に変更されます。私がこのアプローチを好む理由は、where句を複数回繰り返す必要がないためです。これにより、エラーやメンテナンスの問題が発生する可能性があります。

于 2013-01-31T15:59:52.217 に答える
0

UNION演算子は、2 つ以上の SELECT ステートメントの結果セットを結合するために使用されます。@bluefeet's以下の条件を満たしていれば、回答に示されているように UNION を利用できます。

  • UNION 内の SELECT ステートメントには、同じ数の列が必要です
  • 列も同様のデータ型である必要があります
  • 各 SELECT ステートメントの列は同じ順序である必要があります。
于 2013-01-31T15:57:28.177 に答える