我写了一个连接3个表的查询:
SELECT `notification`.`nid`, `notification`.`type`, `notification`.`read`, `notification`.`time`, `user`.`pro_img`, `user`.`fname` ,`user`.`lname`, `user`.`username`, `accommodation`.`aid`, `accommodation`.`title`, `accommodation`.`home_img`
FROM `notification` RIGHT OUTER JOIN `user` ON `notification`.`rid`=`user`.`id` RIGHT OUTER JOIN `accommodation` ON `notification`.`acco_id`=`accommodation`.`aid`
WHERE `notification`.`uid`=$uid ORDER BY `notification`.`time` DESC;
我希望在notification
时获得结果。acco_id
= accommodation
。找不到aid
,所以空列可以,但我想要行
答案 0 :(得分:1)
您的查询结合了一些不合适的内容。您正在使用的right joins
将保留右侧表格中的所有内容,在您的情况user
和accomodation
中,但使用其中两个具有相同左侧的内容将使这无用。您where
中的条件也涉及joins
的左侧,这也会使right joins
毫无意义。
假设您想要所有notifications
,无论它们是否与users
和accomodations
匹配,您只需要从right
更改为left joins
}。
SELECT notification.nid,
notification.type,
notification.read,
notification.time,
user.pro_img,
user.fname,
user.lname,
user.username,
accommodation.aid,
accommodation.title,
accommodation.home_img
FROM notification
LEFT OUTER JOIN
user
ON notification.rid = user.id
LEFT OUTER JOIN
accommodation
ON notification.acco_id = accommodation.aid
WHERE notification.uid = $uid
ORDER BY notification.time DESC
这将保留notification
中的所有行,并且当其他表上没有匹配的行时,它们将与null
值匹配。