0
SELECT          
    count(t1.id) AS c1
FROM
    table2
    LEFT JOIN table1 AS t1 ON (t1.uid = table2.uid)
WHERE
    table2.mode = 'ls'
GROUP BY
    t1.id

c1 = 6->正解です!

SELECT          
    count(t2.id) AS c2
FROM
    table2
    LEFT JOIN table1 AS t2 ON (t2.pid = table2.id)
WHERE
    table2.mode = 'ls'
GROUP BY
    t1.id

c2 = 1->正解です!

SELECT          
    count(t1.id) AS c1,
    count(t2.id) AS c2
FROM
    table2
    LEFT JOIN table1 AS t1 ON (t1.uid = table2.uid)
    LEFT JOIN table1 AS t2 ON (t2.pid = table2.id)
WHERE
    table2.mode = 'ls'
GROUP BY
    t1.id

c1 = 6->正解です!

c2 = 6->間違っています!

間違った結果を取得せずに、1つのクエリで両方のカウントを要求するにはどうすればよいですか?

同じテーブル(table1)で2つの異なるリクエストをカウントする必要があります。

そのため、両方のリクエストにエイリアスを使用しています。(t1)。各エイリアスリクエストは、単独で正常に機能しています。同じクエリで両方を使用すると、間違った結果が得られます。

4

3 に答える 3

1

完全なクエリでの問題は、関数ごとのグループ化だと思います。t.idでグループ化しているため、a1.idのカウントは、行数に基づいて異なります。

これが意味するのは、テーブルtに6行ある場合、countはテーブルtに対して6を返すということです。ただし、テーブルaには1対1の関係があるように見えるため、テーブルaには6つの一致する行があり、テーブルtには6つの一致する行があります。そのような

t.id = a.id 1 = 1 2 =2...など。

したがって、あなたのカウントは、あなたが持つべきだと信じているカウントに対して行を返していますか?ここで使いたいのはsum関数だと思います。

于 2012-08-20T17:47:33.823 に答える
1

count()クエリによって返されるレコードの数を取得します。カウントを削除して置き換えた場合、*6行になるため、これらのカウントは両方とも6になります。

2つのサブ選択を使用して、それぞれの結果を返すことができない理由はありますか?

それで:

SELECT subQ1.c1, subQ2.c2 FROM
    (SELECT count(t1.id) AS c1 FROM table2
        LEFT JOIN table1 AS t1 ON (t1.uid = table2.uid)
        WHERE table2.mode = 'ls') as subQ1, 
    (SELECT count(t2.id) AS c2 FROM table2
        LEFT JOIN table1 AS t2 ON (t2.pid = table2.id)
        WHERE table2.mode = 'ls') as SubQ2;
于 2012-08-20T18:27:16.217 に答える
0

あなたはこれを試すことができます...しかし、私はあなたが何をしようとしているのかよくわかりません。

SELECT (...)
    count(CASE WHEN t1.uid = t3.uid THEN t1.id ELSE NULL END) AS CBanz,
    count(CASE WHEN ta1.pid = t3.id THEN a1.id ELSE NULL END) AS CBanz1
FROM
    t0
    LEFT JOIN (...)
    LEFT JOIN t1 ON (t1.uid = t3.uid)
    LEFT JOIN t1 AS a1 ON (a1.pid = t3.id)
WHERE (...)
于 2012-08-20T16:32:30.270 に答える