Reputation: 237
I have three table like this:
manga
| id | sendby
------------------
| 1 | 1
| 2 | 1
| 3 | 1
| 4 | 1
chaprer
| id | sendby | translator | graphic
-------------------------------------------
| 1 | 1 | admin | other
| 2 | 1 | admin | other
| 3 | 1 | admin | admin
| 4 | 1 | other | admin
user
| userid | username
-----------------------
| 1 | admin
I'm trying to count what ever i have sent, but the result is not correct.
i have tried below query:
SELECT username,
SUM(
CASE WHEN m.sendby = u.userid
THEN 1 ELSE 0 END
) AS manga,
SUM(
CASE WHEN c.sendby = u.userid
THEN 1 ELSE 0 END
) AS chapter,
SUM(
CASE WHEN c.translator = u.username
THEN 1 ELSE 0 END
) AS translator,
SUM(
CASE WHEN c.graphic = u.username
THEN 1 ELSE 0 END
) AS graphic
FROM user u
left JOIN manga m
ON m.sendby = u.userid
left JOIN chapter c
ON c.sendby = u.userid
where u.userid = '1'
but it's return this which is not correct:
manga : 16, chapter : 16, translator : 12, graphic : 8
Upvotes: 2
Views: 140
Reputation: 19882
Here is the query for this
select
m.id,
count(m.sendby) as Manga,
lc.Chapter,
rc.Translater,
c.Grafix
from manga as m
left join (select sendby, count(sendby) as Chapter from chaprer) as lc on lc.sendby = m.sendby
left join (select sendby, count(translater) as Translater from chaprer where translater = 'admin') as rc on rc.sendby = m.sendby
left join (select sendby, count(graphics) as Grafix from chaprer where translater = 'admin') as c on c.sendby = m.sendby
EDITS
I have tested this query and this fetches this result
Query Result
id Manga Chapter Translater Grafix
1 4 4 3 3
Upvotes: 2
Reputation: 1167
A straight-forward approach would be to do something like this:
SELECT username,
(SELECT COUNT(m.sendby) FROM manga m WHERE m.sendby= u.userid) AS manga,
(SELECT COUNT(c.sendby) FROM chapter c WHERE c.sendby= u.userid) AS chapter,
(SELECT COUNT(t.sendby) FROM chapter t WHERE t.translator= u.username) AS translator,
(SELECT COUNT(g.sendby) FROM chapter g WHERE g.graphic= u.username) AS graphic
FROM USER u
WHERE userid=1
You will see the problem in your original query if you run:
SELECT *
FROM USER u
LEFT JOIN manga m
ON m.sendby = u.userid
LEFT JOIN chapter c
ON c.sendby = u.userid
WHERE u.userid = '1'
The left join is returning duplicate rows.
Upvotes: 0
Reputation: 5467
Did you use left JOIN
intentionally? do you know how it works?
Using it twice made your select run on 16 rows result table.
Try first selecting all the results (*), and then fix your FROM
clause to return the desired data to select from.
From your comment, it appears that you ment to use Inner join.
Upvotes: 1