我有这个问题:
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'
中没有匹配,我想给 sp.position 一个 200 的值。所以基本上如果在 'phrase'
表中我有一个 ID=2,但在整个 'position'
表中的 sp.phrase_id 中不存在,然后 sp.position=200 用于 'index'
计算,否则它将是存储在 'position'
表中的任何值。我希望这是有道理的。
2) 我做了一个 GROUP BY se.name。我想对类似 se.name 字段的整个 'index'
值进行实际求和。因此,在现在的结果集中,如果有 20 个具有相同 se.name 的 p.text 行,我想对相同 se.name 的索引列求和。
我更像是一个 PHP 专家,但正在尝试学习更多 MySQL。我坚信让数据库尽可能多地完成工作,而不是在返回数据集后尝试对其进行操作。
我希望问题很清楚。无论如何,1)和2)都可以完成吗?我还想修改此查询以执行更多操作,但我认为如果我将来需要更多帮助,那将需要一个不同的问题。
位置表有一个 engines_id、phrase_id、item_id,这将使它成为一个唯一的条目。我要计算的值是 sp.position 值。但是有些情况下没有这些 ID 组合的条目。如果我刚刚列出的 3 个 ID 的组合没有条目,我想在我的计算中使用 sp.position=200。
最佳答案
怎么样:
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
关于mysql - 连接表 : case statement for no matches?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145993/