Leslie C
Leslie C

Reputation: 43

MySQL - how to combine three tables to get the counts

There are three tables, I would like to get the count of a user's total tweets and the count of likes his total tweets received.

I tried to combine two queries to get what I want but failed. Have looked through several previous questions but still can't figure it out.

id name
1 User1
id UserId (foreign key) content
1 User1 hello
id UserId (foreign key) TweetId (foreign key)
1 User1 hello

First query:

SELECT Users.name, Users.id, COUNT(Tweets.UserId) AS UserTweetCount FROM Users
LEFT JOIN Tweets
ON Users.id = Tweets.UserId
GROUP BY Users.id
ORDER BY UserTweetCount DESC;

enter image description here

Second query:

SELECT Users.name, Users.id, COUNT(Likes.UserId) AS UserTweetBeLikedCount FROM Users
LEFT JOIN Likes
ON Users.id = Likes.UserId
GROUP BY Users.id;

enter image description here

I tried like below but would get wrong UserTweetBeLikedCount counts. The counts would be UserTweetCount's, not UserTweetBeLikedCount's. When I ran two queries separately, it worked well. But when I combined them together, it didn't work right. Don't know how to display the right counts. Can someone give me hints to solve this, please?

SELECT Users.name, Users.id, 
COUNT(Tweets.UserId) AS UserTweetCount, COUNT(Likes.UserId) AS UserTweetBeLikedCount 
FROM Users
LEFT JOIN Tweets
ON Users.id = Tweets.UserId
LEFT JOIN Likes
ON Users.id = Likes.UserId
GROUP BY Users.id
ORDER BY UserTweetCount DESC;

enter image description here

Upvotes: 1

Views: 918

Answers (2)

SELECT u.*,
       (SELECT COUNT(*)
        FROM Tweets t
        WHERE u.id = t.UserId
       ) AS UserTweetCount,
       (SELECT COUNT(*)
        FROM Likes l
        WHERE u.id = l.UserId
       ) AS UserLikeCount
FROM Users u
ORDER BY UserTweetCount DESC;

Upvotes: -1

Gordon Linoff
Gordon Linoff

Reputation: 1269923

I recommend using correlated subqueries for this:

SELECT u.*,
       (SELECT COUNT(*)
        FROM Tweets t
        WHERE u.id = t.UserId
       ) AS UserTweetCount,
       (SELECT COUNT(*)
        FROM Likes l
        WHERE u.id = l.UserId
       ) AS UserLikeCount
FROM Users u
ORDER BY UserTweetCount DESC;

As a note: For performance, you want indexes on Tweets(UserId) and Likes(UserId).

Upvotes: 3

Related Questions