加入表:没有匹配的案例陈述?

时间:2010-06-30 01:54:54

标签: mysql

我有这个问题:

SELECT p.text,se.name,s.sub_name,SUM((p.volume / (SELECT SUM(p.volume) 
                FROM phrase p
                WHERE p.volume IS NOT NULL) * sp.position))
AS `index`
FROM phrase p
LEFT JOIN `position` sp ON sp.phrase_id = p.id
LEFT JOIN `engines` se ON se.id = sp.engine_id
LEFT JOIN item s ON s.id = sp.site_id
WHERE p.volume IS NOT NULL
AND s.ignored = 0
GROUP BY se.name,s.sub_name
ORDER BY se.name,s.sub_name

我想用它做一些事情:

1)'index'的计算结束,我通过sp.position将它全部加倍,然后得到它的SUM。如果在第一个LEFT JOIN 'position'中没有MATCH,我想给sp.position一个200的值。所以基本上如果在'phrase'表中我有一个ID = 2,但是没有存在于整个'position'表的sp.phrase_id中,然后sp.position = 200用于'index'计算,否则它将存储在'position'表中的任何值。我希望这是有道理的。

2)我做了一个GROUP BY se.name。我想实际上对类似的se.name字段的整个'index'值进行求和。所以在现在的结果集中,如果有20个p.text行具有相同的se.name,我想将索引列的SUM用于相同的se.name(s)。

我更像是一个PHP人,但试图学习更多MySQL。我已经成为让数据库尽可能多地完成工作而不是在数据集返回后尝试操作数据集的忠实信徒。

我希望问题清楚。无论如何,1)和2)都可以完成吗?还有更多我希望修改此查询,但我认为如果我将来需要更多帮助,它将需要一个不同的问题。

位置表有一个engines_id,phrase_id,item_id,这将使它成为一个唯一的条目。我想要计算的值是sp.position值。但有些情况下,这些ID的组合没有条目。如果我刚刚列出的3个ID的组合没有条目,我想在我的计算中使用sp.position = 200。

2 个答案:

答案 0 :(得分:1)

这是怎么回事:

select x.name, sum(index) from
(
SELECT p.text,se.name,s.sub_name,SUM((p.volume / (SELECT SUM(p.volume) 
            FROM phrase p
            WHERE p.volume IS NOT NULL) * if(sp.position is null,200,sp.position)))
AS `index`
FROM phrase p
LEFT JOIN `position` sp ON sp.phrase_id = p.id
LEFT JOIN `engines` se ON se.id = sp.engine_id
LEFT JOIN item s ON s.id = sp.site_id
WHERE p.volume IS NOT NULL
AND s.ignored = 0
GROUP BY se.name,s.sub_name
ORDER BY se.name,s.sub_name
 )x
GROUP BY x.name

答案 1 :(得分:1)

尝试以下方法:

1。)在您的情况IFNULL()

中使用IFNULL(sp.position, 200)

2。)我对此部分并不完全清楚,但看起来你已经有了部分要求。