【问题标题】:MySQL Left Join with no matches on Table B, has no ID on Table AMySQL Left Join 在表 B 上没有匹配项,在表 A 上没有 ID
【发布时间】:2017-09-04 12:02:11
【问题描述】:

我尝试做这样的事情:

表 A

NameID | name | other rows
1      | name1
2      | nameA
3      | nameX

表 B

UniqueID | NameID | other rows
1        | 1
2        | 2
3        | 6
4        | 17
5        | 22

不,我想做这样的选择:

SELECT tablea.ID, tablea.name, tableb.*
            FROM tablea
            LEFT JOIN tableb ON tablea.ID = tableb.ID
            WHERE
            tablea.ID != '0'

我现在搜索 ID 和名称。

我总是得到名字,但不是总是得到 ID,只有当 ID 也在表 B 中时。为什么?

我的结果是这样的:

ID   | name
1    | name1
2    | nameA
NULL | nameX

我有这种情况: 我有 TABLE A 电影(带有名称、数据等)。在表 B 我有 这些电影的评分。现在我用一个表格搜索,想看所有评级不完整或根本没有评级的电影,或者任何有或没有评级的电影。

在表 A(所有电影)上使用 LEFT JOIN 并加上 ON-Condition,我搜索电影是否有评级(是否在表 B 中)。 我的结果总是让我知道电影的名字。但是如果 movieID 不在表 B 中(= 没有记录收视率),我不会在结果中得到表 A 中的电影 ID。 所以不是我的整个结果只有movieID为NULL,我可以从这部电影的表A中提取任何其他数据,但不能是ID。

那为什么?

如果ID在ON-term中,是否不能要求tablea.ID?

【问题讨论】:

  • WHERE 将 LEFT JOIN 转换为 INNER JOIN.. 您应该将 WHERE 语句移至 ON 子句
  • 我是否理解正确,WHERE 用于 tablea,ON 用于 tableb,我将它与之结合? WHERE 如何将 LEFT Join 转换为 INNER JOIN?
  • ID 加入 tablea.ID = tableb.ID 是什么? NameID ?/
  • @RaymondNijland 条件为TABLE A,这是查询中使用的主表。
  • 是的,在你的代码中你必须指定,你可以在你的选择中为列加上别名并尝试吗?

标签: mysql join


【解决方案1】:

左连接将显示第一个表中的所有行,并在找到匹配行时从第二个表中添加数据。 如果没有找到匹配的行,左连接将为这些行返回 null(这意味着“未知”)。 如果要从结果中丢弃其他表中没有匹配行的行,则必须使用“内连接”而不是“左连接”。 检查联接的视觉表示以获取更多信息:https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

【讨论】:

  • 我试图更好地解释它。我总共有 3 个表格和一个表格,我可以在其中使用下拉列表来选择我从这些表格中搜索的内容。我有一个代码,它把它加入到这个选择和 WHERE CONDITIONS 中。所以它可能会发生,有时,我不想在 tableb 中搜索任何东西,所以我必须从这个表中选择 ALL。所以我需要左连接。问题是,我从表 A 中获取名称,但不是从同一表 A 中的同一行中获取 ID。我认为是因为我的左连接是 ON tableA.ID = tableB.ID ...可能在表 B 中不匹配。
【解决方案2】:

解决方案是,为表一中的行设置别名,该行在第二个表中重复,并且由于第二个表中没有“行”,结果为 NULL。 如果我将别名放入其中,我可以选择它,剩下的工作由 LEFT JOIN 完成。

须知:mysql_fetch_object 将始终选择最后提及的行,如果该行名称在选择的其他表中相同。就我而言,我 LEFT JOIN 加入了具有相同行名的第二个表。由于 LEFT JOIN,我在 ON 条件下没有结果,我的查询的正确结果是 NULL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2013-10-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多