每当我有两个表时,我想加入其中一些行将有匹配项,而另一些行没有匹配项,我就不知道如何解决我正在使用的列在没有匹配项的条件下被“”覆盖的问题。
下面是一个查询示例:

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

现在,如果“kickstarter”中有一行,而“user_kick_ratings”中没有匹配的行,则项目id将被重写为。我现在知道的唯一解决方法是a)使id列的名称不同,或者b)在column select区域中使用别名,这将迫使我命名我需要的每一列,这是很多方法。
最理想的情况是,我不喜欢这两种选择。是否有方法可以使用不同类型的联接或重新排列查询,以便主表(kickstarter)中的项目id始终存在?
编辑:我要补充的是,我确实需要“kickstarter”中与查询匹配的每一行,但是如果第二个表中的行还不清楚的话,就不会总是有相应的行。

最佳答案

其原因与查询执行的顺序有关。查询将首先连接所有行(不管匹配与否,因为它是左连接),然后将筛选出不符合条件的行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 ...

关于mysql - 编写具有相同列名的LEFT JOIN时,覆盖“ON”值的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33529034/

10-11 02:46
查看更多