MySQL - 从多个表中选择,可能没有连接?
Posted
技术标签:
【中文标题】MySQL - 从多个表中选择,可能没有连接?【英文标题】:MySQL - selecting from multiple tables, possibly without joins? 【发布时间】:2013-01-31 15:48:20 【问题描述】:我已经有一段时间没有需要帮助了,但今天我来这里基本上是为了从您的知识中获得帮助。我目前非常困扰一个非常烦人的 SQL 问题,如下所示。
我有两张桌子。 Painteditems 和特殊物品。两个表都有唯一的列名(painteditemid、specialitemid 等),但两个表共享相似的值。我想从两个表中获取结果。
假设这是我的设置:
彩绘物品
paintedItemName paintedItemColor 可见特殊物品
特殊物品名称 特殊物品颜色 可见我使用了这个查询:
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 行。我应该如何处理?
提前谢谢你。
编辑:固定间距,代码块
【问题讨论】:
你想要怎样的数据?我猜你在找UNION
?
在你的表中定义索引吗?
【参考方案1】:
当然听起来你想要在两个表之间有一个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
【讨论】:
像魅力一样工作,谢谢。我什至从未听说过UNION,哈哈。再次感谢! 好像有错误。如果我用 while($ar = mysql_fetch_array()) 循环遍历它们,我只能从我首先放入查询的那个中填充。在你的情况下,我只能呼应painteditem,而不是访问任何specialitem。它确实创建了某种别名,因为呼应“painteditemid”实际上是“specialitemid”。 :// @Mave 这些列将具有顶部查询中项目的名称。如果要区分painted
和 special
数据,则可以添加有助于识别每个表中的数据的列。查看我的编辑。【参考方案2】:
UNION 运算符用于组合两个或多个 SELECT 语句的结果集。如果您满足以下条件,您可以使用@bluefeet's
答案中所示的 UNION。
【讨论】:
【参考方案3】:我会在子查询中使用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
子句不需要重复多次——这可能会导致错误和维护问题。
【讨论】:
以上是关于MySQL - 从多个表中选择,可能没有连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?