MySQL加入和求和/合并查询

时间:2013-08-18 09:27:44

标签: mysql join sum

我创建了一个分数示例来演示我的问题。

会员可以奖励其他会员积分,我正在尝试构建一个查询,该查询将显示用户拥有的积分和用户提供的积分。

数据库示例

成员,

+----+----------+
| id | username |
+----+----------+
|  1 | user1    |
|  2 | user2    |
|  3 | user3    |
+----+----------+

点,

+-------+--------+--------+
| IDFor | IDFrom | Pointz |
+-------+--------+--------+
|     1 |      2 |      5 |
|     1 |      2 |      5 |
|     3 |      1 |      2 |
+-------+--------+--------+

我正在寻找的回报是,

+-----------+--------+-------+
| username  | Pointz | Given |
+-----------+--------+-------+
| user1     |     10 |     2 |
| user2     |      0 |    10 |
| user3     |      2 |     0 |
+-----------+--------+-------+

我的查询都返回,

+-----------+--------+-------+
| username  | Pointz | Given |
+-----------+--------+-------+
| user1     |     10 |     4 |
| user2     |      0 |    10 |
| user3     |      2 |     0 |
+-----------+--------+-------+

http://sqlfiddle.com/#!2/32ae6/6

SELECT a.`username`, sum(a.`Pointz`), sum(b.`Pointz`) FROM
  (SELECT * FROM `members`
LEFT JOIN  `Example`.`Points` AS p ON `members`.`id` = p.`IDFor` ) AS a
LEFT JOIN

  (SELECT * FROM `members` 
LEFT JOIN  `Example`.`Points` AS n ON `members`.`id` = n.`IDFrom` ) AS b
ON a.id = b.id
GROUP BY  a.`id`

http://sqlfiddle.com/#!2/32ae6/7

SELECT `members`.`username`,sum(p.`Pointz`),sum(n.`Pointz`)
FROM `members`
LEFT JOIN `Example`.`Points` as p ON p.`IDFor` = `members`.`id`
LEFT JOIN `Example`.`Points` as n ON n.`IDFrom` = `members`.`id`
GROUP BY `members`.`id`

似乎是一个常见的问题,弹出但没有找到解决方案,我所有其他类似问题的尝试都没有很好地结束,谢谢大家。

3 个答案:

答案 0 :(得分:1)

这就是你想要的

select a.username, ifnull(Pointz, 0) Pointz, ifnull(Given, 0) Given from
  (SELECT id, `username`, sum(`Pointz`) Pointz FROM `members` 
  LEFT JOIN `Points` ON `members`.`id` = `Points`.`IDFor` group by id) a 
  left join
  (SELECT id, `username`, sum(`Pointz`) Given FROM `members` 
  LEFT JOIN `Points` ON `members`.`id` = `Points`.`IDFrom` group by id) b
  on a.id = b.id

答案 1 :(得分:1)

尝试:

SELECT m.username, 
       COALESCE( pr.preceived, 0 ) as Pointz,
       COALESCE( pg.pgiven, 0 ) as Given

FROM members m

LEFT JOIN ( SELECT IDFor, sum(pointz) as preceived 
            FROM Points 
            GROUP BY IDFor ) pr
ON m.id = pr.IDFor

LEFT JOIN ( SELECT IDFrom, sum(pointz) as pgiven 
            FROM Points 
            GROUP BY IDFrom ) pg
ON m.id = pg.IDFrom

http://sqlfiddle.com/#!2/32ae6/48

答案 2 :(得分:1)

试试这个:

SELECT m.`username`, 
       ifnull((SELECT sum(`Pointz`) FROM Points p
        WHERE p.IDFor = m.id ), 0),
       ifnull((SELECT sum(`Pointz`) FROM Points p
        WHERE p.IDFrom = m.id ), 0)
FROM Members m

SQLFiddle