Context:
- I have an app that shows posts and comments on the home page.
- My intention is to limit the number of posts shown (ie, 10 posts) and…
- Limit the number of comments shown per post (ie, 2 comments).
- Show the total number of comments in the front end (ie, “read all 10 comments”)
MySQL:
(SELECT *
FROM (SELECT *
FROM post
ORDER BY post_timestamp DESC
LIMIT 0, 10) AS p
JOIN user_profiles
ON user_id = p.post_author_id
LEFT JOIN (SELECT *
FROM data
JOIN pts
ON pts_id = pts_id_fk) AS d
ON d.data_id = p.data_id_fk
LEFT JOIN (SELECT *
FROM comment
JOIN user_profiles
ON user_id = comment_author_id
ORDER BY comment_id ASC) AS c
ON p.post_id = c.post_id_fk))
I’ve failed to insert LIMIT and COUNT in this code to get what I want – any suggestions? – will be glad to post more info if needed.
If I’m understanding you correctly you want no more than 10 posts (and 2 comments) to come back for each unique user in the returned result set.
This is very easy in SQLServer / Oracle / Postgre using a “row_number() PARTITION BY”.
Unfortunately there is no such function in MySql. Similar question has been asked here:
ROW_NUMBER() in MySQL
I’m sorry I can’t offer a more specific solution for MySql. Definitely further research “row number partition by” equivalents for MySql.
The essence of what this does:
You can add a set of columns that make up a unique set, say user id for example sake (this is the “partition”) A “row number” column is then added to each row that matches the partition and starts over when it changes.
This should illustrate:
You can then add an outer query that says: select where row_number <= 10, which can be used in your case to limit to no more than 10 posts. Using the max row_number for that user to determine the “read all 10 comments” part.
Good luck!