嗨,我正试图加入一个像这样的表:
SELECT
u.mobile_number,
u.dob,
u.gender,
u.country,
SUM(b.reward_points) AS points
FROM users u
JOIN bookings b ON u.user_id=b.user_id
WHERE u.user_id=20
AND b.attended=1
AND b.review_completed=1
AND b.date > "2010-03-12"
AND b.reward_used=0
但是因为预订表没有user_id 20的记录,所以返回的所有列都具有NULL值。我想获取用户的值并返回NULL(当预订表中没有找到相应的行时)。我怎样才能做到这一点?我做错了什么?
答案 0 :(得分:1)
您需要将表b上的所有条件从WHERE子句移动到ON子句:
SELECT
u.mobile_number,
u.dob,
u.gender,
u.country,
SUM(b.reward_points) AS points
FROM users u
LEFT JOIN bookings b
ON u.user_id=b.user_id
AND b.attended=1
AND b.review_completed=1
AND b.date > "2010-03-12"
AND b.reward_used=0
WHERE u.user_id=20
<强>解释强>:
WHERE
子句过滤结果,无论您使用何种类型的JOIN
,表b中没有匹配的记录都不能满足此表的任何条件,因此查询不会返回它们。 ON
子句定义了如何将表b中的记录附加到表u中的记录(因此只有b.attended = 1等等的记录才会被连接)。
答案 1 :(得分:0)
尝试使用INNER JOIN
代替JOIN
,只有在booking
表中有符合条件u.user_id=b.user_id
的行时才能加入。
答案 2 :(得分:0)
您可以添加以下条款:
group by u.mobile_number, u.dob, u.gender, u.country
在原始查询的末尾,也使用INNER JOIN而不是JOIN。希望这会有所帮助。