2

我需要帮助已经有一段时间了,但今天我来这里基本上是从你的知识中获得帮助。我目前非常困扰一个非常烦人的 SQL 问题,如下所示。

我有两张桌子。Painteditems 和特殊物品。两个表都有唯一的列名(painteditemid、specialitemid 等),但两个表共享相似的值。我想从两个表中得到结果。

假设这是我的设置:

彩绘物品

  • 绘制项目名称
  • 彩绘项目颜色
  • 可见的

特殊物品

  • 特殊物品名称
  • 特殊项目颜色
  • 可见的

我使用了这个查询:

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`

仍然是 260k 行。我应该如何处理这个?

先感谢您。

编辑:固定间距,代码块

4

3 回答 3

7

当然听起来你想要UNION两张桌子之间的一个。现在,您得到的是笛卡尔积,这就是结果如此之大的原因:

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运算符用于组合两个或多个 SELECT 语句的结果集。挑衅如果您满足以下条件,您可以使用 UNION,如@bluefeet's答案所示。

  • UNION 中的 SELECT 语句必须具有相同的列数
  • 列还必须具有相似的数据类型
  • 每个 SELECT 语句中的列的顺序必须相同。
于 2013-01-31T15:57:28.177 回答
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'

这允许您只有一组结果。在 aunion中,列名来自第一个子查询,这会将其重命名为更通用的名称。我喜欢这种方法的原因是该where子句不需要重复多次——这可能会导致错误和维护问题。

于 2013-01-31T15:59:52.217 回答