【问题标题】:Retrieve data from both matching and non matching rows从匹配和不匹配的行中检索数据
【发布时间】:2020-09-01 22:48:03
【问题描述】:

根据下面的查询,您可以看到查询只返回匹配的行,但我想从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

【问题讨论】:

  • 你的意思是你想做FULL JOIN?
  • 是的,我想要我的 u.* 中的所有行,但也不匹配行。

标签: php mysql sql select group-by


【解决方案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_id
left join connections c on c.u_id_fk   = u.u_id
left join packages p    on c.p.pkg_id  = pkg_id_fk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多