从匹配行和非匹配行中检索数据

根据下面的查询,您可以看到查询只返回匹配的行,但我想从USERS表中检索所有行并null代替不匹配的行。


select 

    u.*,

    p.p_title,

    DATE_FORMAT(max(trans.expiry), '%d-%m-%Y %H:%i:%s') as expiry_date,cn.cell_num 

from (

    select t.e_date as expiry 

    from connections c, trans_tbl t,users u 

    where c.v_lan_id=t.vlanconfk and u.u_id = t.u_id_fk

) AS trans,

users u INNER JOIN connections c on u.u_id=c.u_id_fk

INNER JOIN packages p on c.pkg_id_fk=p.pkg_id

INNER JOIN cell_num cn on u.u_id=cn.u_id_fk


HUX布斯
浏览 112回答 1
1回答

牛魔王的故事

我认为你正在寻找left joins。但是,您的查询还有其他几个缺陷:您正在混合显式和隐式连接;始终使用显式连接(使用关键字on)select您在子句 ( )中有一个聚合函数max()以及非聚合列,但没有group by子句子查询的目的相当不清楚:它使用了外部查询中使用的几个表,这没有什么意义,而且可能不是最优的我怀疑您可以将其表述为:select     u.*,    p.p_title,    (        select date_format(max(t.expiry), '%d-%m-%y %h:%i:%s')         from trans_tbl t        where t.vlanconfk = c.v_lan_id and t.u_id_fk = u.u_id    ) expiry    cn.cell_num from users u left join cell_num cn   on cn.u_id_fk  = u.u_idleft join connections c on c.u_id_fk   = u.u_idleft join packages p    on c.p.pkg_id  = pkg_id_fk
打开App,查看更多内容
随时随地看视频慕课网APP