mysql 写入具有相同列名的LEFT JOIN时覆盖“ON”值的方法

pvabu6sv  于 2023-01-01  发布在  Mysql
关注(0)|答案(3)|浏览(243)

每当我有两个要连接的表,其中一些行将有匹配,而另一些行没有匹配时,我不知道如何解决我用于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'中与查询匹配的每一行,但是如果这一点还不清楚的话,第二个表并不总是有对应的行。

lb3vh1jj

lb3vh1jj1#

这与查询的执行顺序有关,查询首先连接所有行(不管是否匹配,因为这是一个左连接),然后过滤掉不满足条件rating >= 1的行,有效地删除了任何一开始就没有匹配的行。
要更正此问题,您需要将联接更改为仅在评级〉= 1时联接。这样,您仍然可以从第一个表中获取所有行,而仅从第二个表中获取所需的匹配项。请尝试以下操作:

SELECT *
FROM kickstarter k
LEFT JOIN user_kick_ratings ukr
ON k.project_id = ukr.project_id AND ukr.rating >= 1;

至于被覆盖的id,你应该重写你的查询,只选择相关的列,没有必要从两个表中选择project_id,因为它们总是相同的,你应该从保证有值的表中选择它;在这种情况下,kickstarter:

SELECT k.project_id, k.stuff, ukr.rating
FROM ...
tcbh2hod

tcbh2hod2#

找到了,而且很简单!只需要使用RIGHT JOIN和翻转表的顺序。尽管很简单,我希望有一天能帮助到别人。

SELECT * FROM user_kick_ratings 
RIGHT JOIN kickstarter 
ON kickstarter.project_id=user_kick_ratings.project_id 
WHERE rating>=1
x9ybnkn6

x9ybnkn63#

对于简单情况:

除了执行SELECT *,您还可以使用

SELECT table2.*, table1.*   -- notice the reverse order!
FROM table1 
LEFT JOIN table2 .....

它们按照引用顺序相互覆盖。
现在你得到了table1的id。

相关问题