【问题标题】:MySQL Sub-Query or LEFT JOIN for SELECTing missing columns?用于选择缺失列的 MySQL 子查询或 LEFT JOIN?
【发布时间】:2013-01-23 22:39:30
【问题描述】:

我需要对 3 个表执行 SELECT 查询,但我不知道使用子查询是否比 LEFT JOIN 更好,因为在某些情况下可能会丢失一列。这些是表格:

选项(名称、信息...)

所有者(姓名、地址)

Rel (idoption, idowner)

SELECT 应返回每条记录中带有所有者名称的所有选项,但在某些情况下,选项可能未连接到任何所有者,并且所有者的名称应为空。 有什么建议么?提前致谢

【问题讨论】:

  • 这是多对多的关系吗?如果选项没有拥有所有者,您期望什么结果?
  • >在某些情况下,选项可能未连接到任何所有者,并且所有者的名称应该为空
  • 我不知道这个例子是否很好地解释了这种情况,但是是的,一个选项可以链接到多个所有者。
  • 如果您离开加入所有者,您将获得所有选项作为列表,一个一个,如果有所有者记录,则附加。因此,无论如何,您都将获得所有选项,即使它们有多个所有者。

标签: mysql


【解决方案1】:

LEFT JOIN 可能是适当的响应,并且可能会比子查询更快,具体取决于您的结果(它们可能会编译成相同的计划)。

SELECT
    op.name
    ,op.info
    ,...
    ,ow.name
    ,ow.address
FROM
    options op
LEFT OUTER JOIN
    Rel r
        ON r.idoption = op.id
LEFT OUTER JOIN
    owners ow
        ON ow.id = r.idowner

【讨论】:

    【解决方案2】:

    LEFT JOIN 那么,无论是否有匹配的 Owner,它都会得到所有的 Options——“这个对左表的额外考虑可以被认为是一种特殊的保存。左表中的每个项目都会显示出来在 MySQL 结果中,即使与它所连接的另一个表不匹配。"

    来自:http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php

    【讨论】:

      【解决方案3】:

      左连接将比子查询更高效、更快。如果您可以在没有匹配的情况下使用 NULL,那么这是更好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2018-01-15
        • 2015-03-16
        • 1970-01-01
        • 2015-02-22
        相关资源
        最近更新 更多