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 这些列将具有顶部查询中项目的名称。如果要区分 paintedspecial 数据,则可以添加有助于识别每个表中的数据的列。查看我的编辑。【参考方案2】:

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

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

【讨论】:

【参考方案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 连接语句选择与链接表中的多个值匹配的记录?

MySQL - 从多个表中选择并显示多个字段

MySQL从具有条件的多个表中选择

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

尝试在某个日期后从多个 mysql 表中进行选择

SQL - 如何从多个可能的列名中进行选择?