0

我有这个 sql 查询,它结合了两个查询,对于一个特定问题(名为标题)的特定用户,首先返回它们为负数的分数的计数和总和,然后返回正分数的总和和计数:

 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,它工作正常。例如,如果一个 id 为 30 的人在 title1 中有 2 个正分,而在 title1 上没有负分,则查询为 neg_count 和 neg_sum 以及 pos_sum 和 pos_count 返回 null。但如果我只运行积极工作的部分,它确实有效......

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

4

3 回答 3

1

You can use RIGHT JOIN (I suspect mysql 5 or greater only, otherwise use left join and swap the sub-queries around). RIGHT JOIN insists on an ON clause but you can use a dummy 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
于 2014-08-26T14:33:26.687 回答
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
于 2014-08-26T16:32:37.040 回答
0

它按预期工作。文档说

在没有连接条件的情况下,INNER JOIN 和 ,(逗号)在语义上是等效的:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都连接到第二个表中的每一行)。

所以第一个有 0 行的表与第二个表中的 0 行匹配,你没有得到任何结果。您可能必须根据需要使用不同的连接条件。

于 2014-08-26T14:13:20.510 回答