0

stackoverflow に関する多くの役立つ情報を見つけましたが、次の問題を解決するにはまだ少し不足しています。

次のような2つのテーブルuserscoresuserpointsがあります。

#table userscores (saves userpoints each month) 

date          userid   points
2012-05-01    1        23
2012-06-01    1        34


#table userpoints (recent points) 

userid   points
1        23
2        10
3        15

以下を使用して、現在の月の最近のユーザーポイントと保存されたユーザーポイント (テーブル「userscores」から) の差を計算する方法を見つけることができました。

SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
    FROM `userpoints`,`userscores` 
    WHERE userpoints.userid=userscores.userid 
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
        AND userpoints.userid != ".$adminID."
    ORDER BY mpoints DESC;"

ただし、このクエリは両方のテーブルのユーザー ID を比較するだけであり、テーブル userpoints には存在するがテーブル userscores には存在しないユーザーID は無視されます。

新しく作成されたユーザー ID (テーブル ユーザーポイント内) もスコアと見なされるように、クエリを変更する必要があります。


テーブルuserscoresに存在しないユーザーIDを取得するためにクエリを実行する方法を見つけました:

 SELECT userpoints.userid FROM `userpoints` 
      WHERE userpoints.userid 
           NOT IN(SELECT qa_userscores.userid FROM `qa_userscores`)


両方を組み合わせる必要がありますが、次のことを試してもうまくいきません。

SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
FROM `userpoints`,`userscores` 
WHERE ( 
    userpoints.userid = userscores.userid
    AND YEAR(userscores.date) = YEAR(CURDATE()) 
    AND MONTH(userscores.date) = MONTH(CURDATE())
    AND userpoints.userid != ".$adminID."
)
OR ( 
    userpoints.userid IN(SELECT userpoints.userid FROM `userpoints` 
        WHERE userpoints.userid 
            NOT IN(SELECT DISTINCT userscores.userid FROM `userscores`)) 
)
ORDER BY mpoints DESC;


どんな助けでも感謝します。

4

2 に答える 2

1
SELECT userpoints.userid, userpoints.points - coalesce(userscores.points,0) 
                                                 AS mpoints 
    FROM `userpoints`
    left join `userscores` on userpoints.userid=userscores.userid         
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
    where userpoints.userid != ".$adminID."
    ORDER BY mpoints DESC;"

左結合では、右側に対応する行がない場合でも、左側の行が自動的に保持されます。右側でチェックするすべての条件は、結合条件に含まれている必要があります。最後に、右側の値がない場合はデフォルト値を使用する必要があります。

于 2012-06-18T14:59:52.537 に答える
0

を使用して、2 つのクエリの結果を組み合わせることができますUNION

SELECT userpoints.userid, userpoints.points - userscores.points AS mpoints 
    FROM `userpoints`,`userscores` 
    WHERE userpoints.userid=userscores.userid 
        AND YEAR(userscores.date) = YEAR(CURDATE()) 
        AND MONTH(userscores.date) = MONTH(CURDATE())
UNION 

SELECT userpoints.userid, points as mpoints FROM `userpoints` 
      WHERE userpoints.userid 
           NOT IN(SELECT userscores.userid FROM `userscores`)

の使用方法の詳細については、 mysql のドキュメントを参照してくださいUNION

于 2012-06-18T15:07:26.050 に答える