这是我的桌子:
表程序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 JOINLOINIVEAU1,因为这似乎没有必要
更新了其他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 JOINCOALESCE来获得已解决的佣金。
性能调整
使用EXPLAIN [EXTENDED] ...查看您的查询是如何执行的,并在每个表中使用下列列的复合索引组合来进行播放:
PROGRAMME:([id,],pmt_id,ln1_id,佣金,佣金开始,佣金结束)
PROGRAMME_DEPARTMENT:(付款id、ln1 id、部门id)
COMMISSION:(付款id、ln1 id、部门id、佣金)
PROMOTEUR:(付款编号,佣金,佣金开始,佣金结束)

10-05 19:28