2

I have created a points example to demonstrate my issue.

A members can reward other members points, I am trying to build a query which will display the points a user has and points user has given.

Database Example

Members,

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

Points,

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

The return I am looking for is,

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

Both my queries return,

+-----------+--------+-------+
| 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`

Seems to be a common question that pops up but have not found a solution, all my other attempts from similar questions have not ended well, Thanks all.

3 Answers 3

1

This is what u want

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
Sign up to request clarification or add additional context in comments.

1 Comment

WOW, tested before the edit, implemented into my project and worked a treat. will check out your edit, shortly :)
1

Try:

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

Comments

1

Try this:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.