SQL查询关联第三张comment表异常:无法获取complaint表数据求助
解决SQL关联三张表拿不到complaint数据的问题
嘿,我来帮你捋捋这个查询的问题所在~先看你现在的SQL:
SELECT t.*,complaint.*, `comment`.* FROM queue t LEFT JOIN complaint on complaint.queue_id = t.id AND t.state='open' RIGHT JOIN `comment` on `comment`.queue_id = t.id AND t.state='open' ORDER BY date_sort DESC
为啥拿不到complaint数据?
主要是RIGHT JOIN的逻辑和条件位置搞的鬼:
- RIGHT JOIN会强制保留
comment表所有符合条件的行,而queue和complaint只保留能匹配到comment的部分。如果某个comment对应的queue行没有关联的complaint,那complaint字段就全是NULL;更坑的是你把t.state='open'写在了JOIN的ON子句里,这会导致如果queue行的state不是open,只要comment能关联到它,这行还是会被保留,但此时complaint的连接条件因为state不满足,自然拿不到数据。 - 混合用LEFT和RIGHT JOIN很容易把逻辑搞乱,尤其是你本来只想拿
state='open'的queue数据,以及对应的complaint和comment,这种写法完全偏离了需求方向。
给你两种靠谱的写法
写法一:优先保留open状态的queue数据(最可能符合你的需求)
先过滤出state为open的queue,再分别左连接complaint和comment,这样所有符合条件的queue都会被保留,对应的关联数据能拿到就拿,拿不到显示NULL:
SELECT t.*, complaint.*, `comment`.* FROM queue t LEFT JOIN complaint ON complaint.queue_id = t.id LEFT JOIN `comment` ON `comment`.queue_id = t.id WHERE t.state = 'open' -- 这里把state条件放WHERE,先筛出要的queue数据 ORDER BY date_sort DESC
写法二:必须保留所有符合条件的comment数据
如果你实际需求是要保留所有comment,同时关联对应的open状态的queue和complaint,那可以把comment放前面,再左连接其他表:
SELECT t.*, complaint.*, c.* FROM `comment` c LEFT JOIN queue t ON c.queue_id = t.id AND t.state = 'open' LEFT JOIN complaint ON complaint.queue_id = t.id ORDER BY t.date_sort DESC
小提醒
尽量别混合用LEFT和RIGHT JOIN,换个表顺序用LEFT JOIN就行,逻辑清晰多了;还有,主表的过滤条件(比如t.state='open')放WHERE里比放ON里更靠谱,能确保你只处理需要的主表数据~
内容的提问来源于stack exchange,提问作者user3511786
相关产品推荐
相关产品推荐

