2

データベースには2つのテーブルがあり、各テーブルに2つの列があり、1つはユーザーID用で、もう1つは数値データを表示するためのものです。

数値列の値を追加したいだけですが、問題は、両方のテーブルが同じ使用済み ID を持つことは必須ではないということです。

例を使用して説明します。

table1

userid  score1

  1       200
  2       300


table2

userid  score2

  1       400

だから今私がしたいのは、ユーザーIDに従ってこれら2つのテーブルのスコアフォームを合計し、次のような新しいテーブルに表示することです:

userid  score_sum

  1       600
  2       300

私が単に使用する場合

Select sum(table1.score1+table2.score2) 
FROM table1 JOIN table2 ON table1.id=table2.id

userid 12番目のテーブルに存在しないため、合計のみが表示さuserid 2れます。この問題を解決する方法を教えてください。

4

3 に答える 3

4

結合が必要かどうかわからない場合は、(すべての)スコアテーブルを結合し、外部クエリでグループ化して合計する必要があります

SELECT userid, SUM(score)
FROM ( 
    SELECT userid, score1 as score FROM table1 
    UNION ALL SELECT userid, score2 as score FROM table2
) t 
GROUP BY t.userid 
于 2012-04-23T19:24:38.093 に答える
4

通常、完全な外部結合を行うことでこの問題を解決しますが、MySql はそのような結合をサポートしていないため、偽装する必要があります。

クエリ

SELECT SUM(COALESCE(table1.score1,0) + COALESCE(table2.score2,0))
FROM (
    SELECT DISTINCT(id) FROM (
        SELECT userid FROM table1 UNION SELECT userid FROM table2
    ) tmp
) userids
LEFT JOIN table2 ON table2.userid = userids.userid
LEFT JOIN table1 ON table1.userid = userids.userid
GROUP BY table1.userid

説明

まず、いずれかの table1orに存在するすべてのユーザー ID のリストを取得する必要があります。table2これにより、このリストをデータセットとして使用してLEFT OUTER JOINfrom を実行できます。選択したテーブルにユーザーID Xが含まれていない場合、そのユーザーは最終結果にまったく表示されないため、結合を開始する、table1または結合を切断しないアプローチ。table2

userids副選択を介して結果セットを作成したLEFT JOINので、各ユーザーのスコアを取得するために両方のテーブルに関心を持っています。ユーザーが両方のテーブルに存在しない場合、NULLそのユーザーのスコアは (NULL + numberを与えるためNULL) になるため、 anyをCOALESCEに変換するために使用します。NULL0

このクエリは、どのユーザーがどのテーブルに含まれているか (または含まれていないか)、またはテーブルがクエリに表示される順序に関係なく、正しく機能することに注意してください。

于 2012-04-18T09:59:44.627 に答える
0
SELECT SUM(table1.score1 + IS NULL(table2.score2) 
FROM table1 
LEFT JOIN table2 
ON table1=table1.id
于 2012-04-18T09:45:39.540 に答える