0

次のSQLクエリがあります。

SELECT    u.username, SUM(p.points) AS points,
          SUM(sp.spPoints) AS spPoints,
          (SUM(sp.spPoints) - SUM(p.points)) AS Puntos_Restantes
FROM      users as u
LEFT JOIN points as p ON (u.userid = p.userid)
LEFT JOIN sppoints AS sp ON (u.userid = sp.userid)
WHERE     u.userid = '1'
GROUP BY  u.userid

私の目標は、2 つのフィールドを合計してから減算することですが、上記のクエリを実行すると、2 番目の SUM が間違っています。
テーブルは次のようになります。

points: pointId, userId, points    
sppoints: spPointId, userId, spPoints    

ポイントではこの量があります: 25 と spPoints: 10 ですが、クエリを実行すると次のようになります:

points  spPoints    Puntos_Restantes
 25       30              5

ここで何がうまくいかないのですか?

4

1 に答える 1

2

このテーブルusersは、他の 2 つのテーブルと一対多の関係にあります。これにより、2 つの結合によりミニデカルト積が生成され、points列に同じデータが含まれる複数の行が生成され、それらが集計されます。

この問題を回避するために、サブクエリを使用してグループ化し、結合することができます。

SELECT 
      u.username
    , COALESCE(p.pPoints,0) 
        AS pPoints
    , COALESCE(sp.spPoints,0) 
        AS spPoints
    , COALESCE(p.pPoints,0) - COALESCE(sp.spPoints,0)
        AS Puntos_Restantes
FROM 
      users as u
  LEFT JOIN 
      ( SELECT userid, SUM(points) AS pPoints
        FROM points
        WHERE userid = 1
        GROUP BY userid
      ) AS p
    ON u.userid = p.userid
  LEFT JOIN 
      ( SELECT userid, SUM(spPoints) AS spPoints
        FROM sppoints
        WHERE userid = 1
        GROUP BY userid
      ) AS sp
    ON u.userid = sp.userid
WHERE u.userid = 1 ;

複数のユーザー (またはすべてのユーザー) の結果が必要な場合は、3 つのWHERE userid=1条件を置き換えます (またはそれらをすべて削除します)。

指標points(userid, points)sppoints(userid, spPoints)なり、効率化に役立ちます。

于 2012-07-05T14:03:27.133 に答える