I want to add columns that represent counts from other tables.
I have 3 tables.
Messages
MessageID User Message Topic 1 Tom Hi ball 2 John Hey book 3 Mike Sup book 4 Mike Ok book
Topics
Topic Title Category1 Category2 ball Sports Action Hot book School Study Hot
Stars_Given
starID Topic 1 ball 2 book 3 book 4 book
I want to end up with:
Topic_Review
Topic Title StarCount UserCount MessageCount ball Sports 1 1 1 book school 3 2 3
So basically I want to attach 3 columns with counts of unique values (number of stars given within each topic, unique users who have messages within topic, and the number of unique messages in each topic).
I want to eventually be able to filter on the categories (look in both columns) as well.
Also, I want to eventually sort by the counts that I join. Example, I'm going to have a button that sorts by "number of stars" by ascending order, or sort by "number of users" by descending order, etc.
I've tried adapting other people's answers and I can't get it to work properly.
Can you LEFT JOIN three tables in SQL? Yes, indeed! You can use multiple LEFT JOINs in one query if needed for your analysis. In this article, I will go through some examples to demonstrate how to LEFT JOIN multiple tables in SQL and how to avoid some common pitfalls when doing so.
Left joins can increase the number of rows in the left table if there are multiple matches in the right table.
SQL LEFT JOIN examples Each location belongs to one and only one country while each country can have zero or more locations. The relationship between the countries and locations tables is one-to-many.
MySQL COUNT() Function The COUNT() function returns the number of records returned by a select query.
select t.Topic, t.Title, count(distinct s.starID) as StarCount, count(distinct m.User) as UserCount, count(distinct m.messageID) as MessageCount from Topics t left join Messages m ON m.Topic = t.Topic left join Stars_Given s ON s.Topic = t.Topic group by t.Topic, t.Title
Or, you can perform the aggregation in sub-queries, which will likely be more efficient if you have a substantial amount of data in the tables:
select t.Topic, t.Title, s.StarCount, m.UserCount, m.MessageCount from Topics t left join ( select Topic, count(distinct User) as UserCount, count(*) as MessageCount from Messages group by Topic ) m ON m.Topic = t.Topic left join ( select Topic, count(*) as StarCount from Stars_Given group by Topic ) s ON s.Topic = t.Topic
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With