我需要帮助已经有一段时间,但今天我基本上可以从你的知识中得到帮助。我目前非常讨厌一个非常烦人的SQL问题,如下所示。
我有两张桌子。彩绘项目和专业。两个表都有唯一的列名(painteditemid,specialitemid等),但两个表共享相似的值。我想从两个表中得到结果。
我们说这是我的设置:
PaintedItems
SpecialItems
我使用了这个查询:
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行。我该怎么做呢?
提前谢谢。
编辑:固定间距,代码块
答案 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。
答案 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
子句不需要重复多次 - 这可能导致错误和维护问题。