每当我有两个要连接的表,其中一些行将有匹配,而另一些行没有匹配时,我不知道如何解决我用于ON条件的列在没有匹配时被"“覆盖的问题。
下面是一个查询示例:
SELECT * FROM kickstarter
LEFT JOIN user_kick_ratings
ON kickstarter.project_id=user_kick_ratings.project_id
WHERE rating>=1
现在,只要有一行来自'kickstarter',而没有来自user_kick_ratings的匹配行,project_id就会被覆盖为''.我现在知道的唯一解决方法是a)使id列名不同,或者B)在列选择区域中命名别名,这会迫使我命名我需要的每一列,这是很大的一个问题.
这两个选项我都不喜欢,有没有一种方法可以使用不同类型的连接或重新排列我的查询,以便主表(kickstarter)中的project_id始终存在?
edit:我将添加一条,我确实需要'kickstarter'中与查询匹配的每一行,但是如果这一点还不清楚的话,第二个表并不总是有对应的行。
3条答案
按热度按时间lb3vh1jj1#
这与查询的执行顺序有关,查询首先连接所有行(不管是否匹配,因为这是一个左连接),然后过滤掉不满足条件
rating >= 1
的行,有效地删除了任何一开始就没有匹配的行。要更正此问题,您需要将联接更改为仅在评级〉= 1时联接。这样,您仍然可以从第一个表中获取所有行,而仅从第二个表中获取所需的匹配项。请尝试以下操作:
至于被覆盖的id,你应该重写你的查询,只选择相关的列,没有必要从两个表中选择
project_id
,因为它们总是相同的,你应该从保证有值的表中选择它;在这种情况下,kickstarter:tcbh2hod2#
找到了,而且很简单!只需要使用RIGHT JOIN和翻转表的顺序。尽管很简单,我希望有一天能帮助到别人。
x9ybnkn63#
对于简单情况:
除了执行
SELECT *
,您还可以使用它们按照引用顺序相互覆盖。
现在你得到了
table1
的id。