当一个查询为空且其他查询为结果时检索的连接或其他方法

时间:2014-08-26 13:52:22

标签: mysql count sum left-join right-join

我有这个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。但是如果我只运行那些正面工作的部分就可以了......

我尝试了正确的连接:它仅在第二个查询有结果并且尝试左连接时起作用,并且仅在第一个有结果时才返回值。有没有更好的方法呢?

3 个答案:

答案 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