MySQL - 从多个表中选择,可能没有连接?

时间:2013-01-31 15:48:21

标签: php mysql sql join

我需要帮助已经有一段时间,但今天我基本上可以从你的知识中得到帮助。我目前非常讨厌一个非常烦人的SQL问题,如下所示。

我有两张桌子。彩绘项目和专业。两个表都有唯一的列名(painteditemid,specialitemid等),但两个表共享相似的值。我想从两个表中得到结果。

我们说这是我的设置:

PaintedItems

  • paintedItemName
  • paintedItemColor
  • 可见

SpecialItems

  • specialItemName
  • 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`

仍然是260k行。我该怎么做呢?

提前谢谢。

编辑:固定间距,代码块

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

UNION运算符用于组合两个或多个SELECT语句的结果集。如果您满足以下条件,您可以使用@bluefeet's答案中显示的UNION。

  • UNION中的SELECT语句必须具有相同的编号 列
  • 列也必须具有类似的数据类型
  • 每个SELECT语句中的列必须采用相同的顺序。

答案 2 :(得分:0)

我会在子查询中使用union all执行此操作:

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'

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