2012-09-15 48 views
0

在这个连接查询,我乘两个不同表中的列,premium & points。我希望发生的是,如果没有在premium表联接的列那么乘数为1。乘以两列不同的表......一个空

这里是查询

SELECT parent.*,(premiumtable.bid * pointstable.points) as total FROM strings parent 
     LEFT JOIN premium premiumtable on parent.sid=premiumtable.sid AND premiumtable.paid='1' 
     LEFT JOIN points pointstable on parent.sid=pointstable.`string-id` 
     WHERE parent.category=:category AND (parent.submittype='0' OR parent.submittype='3') GROUP BY parent.id ORDER BY total LIMIT 5 

因此,如果没有什么是对premiumtable,而不是premiumtable.bid * pointstable.points加入了它将是1 * pointstable.points。该premiumtable.bid充当乘数,如果它不存在,我愿意total等于pointstable.points

回答

1

尝试使用COALESCE

SELECT parent.*, 
     (COALESCE(premiumtable.bid,1) * pointstable.points) as total 
FROM strings parent 
LEFT JOIN premium premiumtable 
    on parent.sid=premiumtable.sid AND premiumtable.paid='1' 
LEFT JOIN points pointstable 
    on parent.sid=pointstable.`string-id` 
WHERE parent.category=:category 
AND (parent.submittype='0' OR parent.submittype='3') 
GROUP BY parent.id 
ORDER BY total LIMIT 5 
2

使用case声明:

SELECT parent.*, 
     case when premiumtable.bid is null 
      then pointstable.points 
      else premiumtable.bid * pointstable.points 
     end as total 
FROM strings parent 
LEFT JOIN premium premiumtable on parent.sid=premiumtable.sid AND premiumtable.paid='1' 
LEFT JOIN points pointstable on parent.sid=pointstable.`string-id` 
WHERE parent.category=:category 
AND (parent.submittype='0' OR parent.submittype='3') 
GROUP BY parent.id 
ORDER BY total 
LIMIT 5 
+0

合并似乎就像它会更干净...... –

+0

每个使用任何编程语言编程的人都可以理解'CASE'的语法。每个遇到'COALESCE'的人都被迫查找含义和语法。 “ISNULL”怎么样,这也可以理解? –