Mysql SUM and GROUP BY from 3 tables

Pamela :

I have 3 database tables as follows:

projects:

id

project_name

project_location

status

project_expenses

id

project_id

expense_category

expense_subcategory

amount

userid

date

payment_status

project_status

project_income

id

project_id

project_income

date

userid

project_status

projects.id, project_expenses.project_id and project_income.project_id are related.

I need to create a query displaying Project_ID,Project_Name,SUM of Project_Income,SUM of Project_expenses

I tried the following query but not getting correct result.

SELECT p.id AS id, p.project_name AS project_name, SUM(i.project_income) AS income, SUM(e.amount) AS expenses
FROM project_income i, project_expenses e, projects p
WHERE i.project_id = p.id AND e.project_id = p.id AND p.status = 'Active'
GROUP BY id

I have currently 2 rows in project_income and 4 rows in project_expenses. The result is project_income displays double the values. Something is wrong with my JOIN.

Being a newbie I am unable to understand what i am doing wrong?? Requesting help...

Andreas :

Use sub-selects in the query result columns. No need for GROUP BY.

SELECT p.id
     , p.project_name
     , ( SELECT SUM(i.project_income)
           FROM project_income i
          WHERE i.project_id = p.id
       ) AS income
     , ( SELECT SUM(e.amount)
           FROM project_expenses e
          WHERE e.project_id = p.id
       ) AS expenses
  FROM projects p
 WHERE p.status = 'Active'

The problem with the query in the question is best explained with an example.

You say there are 2 rows in project_income and 4 rows in project_expenses. Let say the 2 incomes are 1000 and 1500, and the 4 expenses are 615, 750, 840, and 900.

Since there are no restrictions between them, that means you'll get the cross join, i.e. 8 records:

income  expense
1000    615
1000    750
1000    840
1000    900
1500    615
1500    750
1500    840
1500    900

Now, when you sum income you get 4 times the value you want, and when you sum expense you get 2 times the value you want.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=336747&siteId=1