【问题标题】:mysql join how to select data nullmysql join如何选择数据null
【发布时间】:2017-06-13 09:31:21
【问题描述】:

我很少有这样结构的表

Promo_Validation

id | promo_id | validation_type | validation_value

Promo_Counter

id | promo_id | tanggal | counter | member_id | mid

Promo_Dtl

id | promo_id | min_amount_trx | max_amount_trx | cashback_type | cashback_value | max_cashback_value

Promo_Participants

id | promo_id | applied_to | created_date

顺便说一句,这些表格用于促销机制..
所以promo_counter 表将计算已经有促销交易的用户.. 如果他们还没有完成促销交易,则在该表上没有创建记录
promo_validationpromo_dtl 表格是保存促销条款和条件的地方
promo_participants table 是加入促销的商家保存的地方


所以,我正在尝试创建一个将它们全部加入的查询,我想显示促销机制数据以及每个用户的计数(用户使用当前促销的次数等)。我的查询看起来像这样

select pp.id as pp_id, pv.id as pv_id, pv.validation_type as pv_validationtype, pv.validation_value as pv_validationvalue,
pc.id as pc_id, pc.tanggal as pc_tanggal, pc.counter as pc_counter, pc.member_id as pc_memberid, pc.mid as pc_mid,
pd.min_amount_trx as pd_minamounttrx, pd.max_amount_trx as pd_maxamounttrx, pd.cashback_type as pd_cashbacktype, pd.cashback_value as pd_cashbackvalue, pd.max_cashback_value as pd_maxcashbackvalue
    from emoney_promo.promo_validation pv
    join emoney_promo.promo_counter pc on pv.promo_id = pc.promo_id
    join emoney_promo.promo_dtl pd on pd.promo_id = pv.promo_id
    join emoney_promo.promo_participants pp on pp.promo_id = pv.promo_id
    where pc.member_id = '0867667762'
    and pp.applied_to = '4518'
    and pc.mid = '4518';

当用户(在 member_id 列上)已经有 emoney_promo.promo_counter 表上的数据时,查询有效。但是当用户在 promo_counter 表中不可用时(该用户尚未完成促销交易),查询不会返回任何内容..

如果用户还没有完成任何促销(在上面的查询中,所以没有pc.member_id = 0867667762,我仍然可以获得结果吗?我的意思是,只需将null 给没有的列结果(来自 promo_counter 表),而不是什么都不返回?

对不起,如果我的话有点复杂顺便说一句:)

【问题讨论】:

  • 您是否尝试使用left joinouter join?检查一下!
  • @AlbertoLópezPérez 我尝试将join emoney_promo.promo_counter pc on pv.promo_id = pc.promo_id 更改为left join emoney_promo.promo_counter pc on pv.promo_id = pc.promo_id,但结果相同.. 顺便说一句,我应该把左连接放在哪里?
  • 您必须将左连接放置在您要连接的表具有空值的位置,例如select * from fulltable left join tablewithnulls on fulltable.notnull = tablewithnulls.maybenull

标签: mysql sql


【解决方案1】:

这个怎么样?

select pp.id as pp_id, pv.id as pv_id, pv.validation_type as pv_validationtype, pv.validation_value as pv_validationvalue,
pc.id as pc_id, pc.tanggal as pc_tanggal, pc.counter as pc_counter, pc.member_id as pc_memberid, pc.mid as pc_mid,
pd.min_amount_trx as pd_minamounttrx, pd.max_amount_trx as pd_maxamounttrx, pd.cashback_type as pd_cashbacktype, pd.cashback_value as pd_cashbackvalue, pd.max_cashback_value as pd_maxcashbackvalue
    from emoney_promo.promo_validation pv
    left join emoney_promo.promo_counter pc on pv.promo_id = pc.promo_id and pc.mid = '4518' and pc.member_id = '0867667762'
    join emoney_promo.promo_dtl pd on pd.promo_id = pv.promo_id
    join emoney_promo.promo_participants pp on pp.promo_id = pv.promo_id
    where pp.applied_to = '4518';

【讨论】:

  • 左连接的连接条件应该有 pc.xyz 子句,主 where 子句不应该。
  • 啊,这就是我想念的……你真是个天才……谢谢!
猜你喜欢
  • 2012-07-15
  • 2018-08-27
  • 2012-12-26
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多