这是我的桌子:
表程序prg
申请号
ln1_标识
付款id
prg_委员会
部门id
表佣金
通讯id
付款id
ln1_标识
部门id
委员会
表促销员pmt
付款id
付款协议
我需要得到餐桌计划的“佣金”
但是当它为空时(prg.commission),我需要从“commission”表中获取“commission”值(com.commission-by the ln1_id,pmt_id and dep_id matching from both table)。
如果没有结果匹配(表COMMISSION中没有结果,其中com.ln1_id=prg.ln1_id和com.pmt_id=prg.ln1_id和com.dep_id=prg.dep_id)我需要得到促销员的“佣金”(pmt.COMMISSION)
我真的不知道怎么用Sql。。。在PHP环境下会更容易,但我必须在MySQL上做,因为在我的每一个程序获得了良好的“佣金”价值后,我需要按ASC订购它们。。。
我不确定我是否容易理解(英语不是我的母语)。这是一个我尝试过的例子(不幸的是没有成功),因为我有太多的条件!
SELECT prg.commision AS commission, pmt.commission AS commission, com.commission AS commission
FROM (((PROGRAMME prg
LEFT JOIN LOINIVEAU1 ln1 ON ln1.ln1_id = prg.ln1_id)
LEFT JOIN PROMOTEUR pmt ON pmt.pmt_id = prg.pmt_id)
LEFT JOIN COMMISSION com ON com.pmt_id = pmt.pmt_id)
WHERE
CASE prg.comission != null
THEN prg.comission
ELSE CASE com.commission != null
THEN com.commission
ELSE pmt.commission
THEN pmt.commission
ORDER BY commission ASC
最佳答案
这是你想要的吗:
SELECT COALESCE(prg.commission, com.commission, pmt.commission) resolved_commission
FROM PROGRAMME prg
LEFT JOIN COMMISSION com
ON com.pmt_id = prg.pmt_id
AND com.ln1_id = prg.ln1_id
AND com.dep_id = prg.dep_id
LEFT JOIN PROMOTEUR pmt
ON pmt.pmt_id = prg.pmt_id
ORDER BY resolved_commission
我已采取以下步骤:
删除了
LEFT JOIN
到LOINIVEAU1
,因为这似乎没有必要更新了其他
LEFT JOIN
条件以反映描述中的条件使用
COALESCE
从逗号分隔的列返回第一个非空值。。这将替换您在CASE
子句中错误放置的WHERE
语句。去掉了不必要的括号。
作为另一个指针。。切勿使用
!= NULL
而应使用IS NOT NULL
。。事实证明我的解决方案不需要这个。更新
以下是进一步的信息:
SELECT CASE
WHEN prg.commission > 0
AND prg.commissionstart >= CURDATE()
AND prg.commissionend < CURDATE() + INTERVAL 1 DAY
THEN prg.commission
WHEN com.commission > 0
THEN com.commission
WHEN pmt.commission > 0
THEN pmt.commission
ELSE 0 /* Whatever you want, probably 0 */
END resolved_commission
FROM PROGRAMME prg
JOIN PROGRAMME_DEPARTMENT prg_dep
ON prg_dep.prg_id = prg.id /* Guessing the JOIN here */
LEFT JOIN COMMISSION com
ON com.pmt_id = prg.pmt_id
AND com.ln1_id = prg.ln1_id
AND com.dep_id = prg_dep.dep_id
LEFT JOIN PROMOTEUR pmt
ON pmt.pmt_id = prg.pmt_id
AND pmt.commissionstart >= CURDATE()
AND pmt.commissionend < CURDATE() + INTERVAL 1 DAY
ORDER BY resolved_commission
应该能让你靠近一点。。
您可以用
x > 0
中的x IS NOT NULL and x > 0
替换CASE
以增加清晰度。我也会认真考虑把所有的佣金放在
COMMISSION
表中,用一个开始和结束来代替prg.commission*
和pmt.commission*
,用一个连接到这个表中间的链接。。这样您就可以去掉所有的0
值,并使用LEFT JOIN
和COALESCE
来获得已解决的佣金。性能调整
使用
EXPLAIN [EXTENDED] ...
查看您的查询是如何执行的,并在每个表中使用下列列的复合索引组合来进行播放:PROGRAMME
:([id,],pmt_id,ln1_id,佣金,佣金开始,佣金结束)PROGRAMME_DEPARTMENT
:(付款id、ln1 id、部门id)COMMISSION
:(付款id、ln1 id、部门id、佣金)PROMOTEUR
:(付款编号,佣金,佣金开始,佣金结束)