我有这个sql查询,它结合了两个查询,对于特定用户的一个独特的事物(命名标题),首先返回它们为负数的分数和总和,以及第二个返回总和和正分数的计数: / p>
SELECT *
FROM (
SELECT title,
count(*) cnt_neg,
sum(score) sum_neg
FROM scores_ofexpert
WHERE user_id = "30"
AND title = "137"
AND score < 0
GROUP BY title
) neg,
(
SELECT count(*) cnt_pos,
sum(score) sum_pos
FROM scores_ofexpert
WHERE user_id = "30"
AND title = "137"
AND score >= 0
GROUP BY title
) pos
问题是:当两个返回值都工作正常时,但是当一个返回null时,如果我运行一个它都显示为null,则它都显示为null。例如,如果id为30的人在title1中有2个正分,而在title1上没有负分,则查询对neg_count和neg_sum以及pos_sum和pos_count返回null。但是如果我只运行那些正面工作的部分就可以了......
我尝试了正确的连接:它仅在第二个查询有结果并且尝试左连接时起作用,并且仅在第一个有结果时才返回值。有没有更好的方法呢?
答案 0 :(得分:1)
你可以使用RIGHT JOIN(我怀疑只有mysql 5或更高版本,否则使用左连接并交换周围的子查询)。 RIGHT JOIN坚持使用ON子句但你可以使用虚拟IE:
SELECT *
FROM (
SELECT title,
count(*) cnt_neg,
sum(score) sum_neg
FROM scores_ofexpert
WHERE user_id = "30"
AND title = "137"
AND score < 0
GROUP BY title
) neg
RIGHT JOIN
(
SELECT count(*) cnt_pos,
sum(score) sum_pos
FROM scores_ofexpert
WHERE user_id = "30"
AND title = "137"
AND score >= 0
GROUP BY title
) pos
ON 1=1
答案 1 :(得分:0)
它按预期工作。 The文档说:
INNER JOIN和(逗号)在没有的情况下在语义上是等价的 连接条件:两者之间产生笛卡尔积 指定的表(即第一个表中的每一行都是 加入第二个表格中的每一行。)
所以第一个0行的表在第二个表中匹配0行,你没有得到任何结果。 您可能必须根据需要使用不同的连接条件。
答案 2 :(得分:0)
我找到了这个答案。它对我很有用:
SELECT
SUM(CASE WHEN s.score < 0 THEN s.score ELSE 0 END) n_sum,COUNT(CASE WHEN s.score < 0 THEN s.score END) n_count,
SUM(CASE WHEN s.score >= 0 THEN s.score ELSE 0 END) p_sum,COUNT(CASE WHEN s.score >= 0 THEN s.score END) p_count,
SUM(s.score) `sum`
FROM scores_ofexpert s
WHERE s.user_id = '30' and title='135'
GROUP BY title