Reputation: 2430
I am trying to create SQL for retrieveing a list of latests posts for the forum thread. I have the following code:
SELECT
item_discuss_thread_id
, item_discuss_post_title
, COUNT(item_discuss_thread_id) AS nb_posts
FROM
item_discuss_posts
GROUP BY
item_discuss_thread_id
Obviously this will group without the respect of if the post is latest or not. item_discuss_post_title
will just get the first row in the group.
I wonder if there's some way around this? If not, what is the best way to solve the problem... only subqueries?
Thanks, Pavel
UPDATE: Please note that I need all threads, LIMIT 1 is not solving the problem. Also ORDER BY is not an option as GROUP BY will select the first record from group anyway. This is not such a simple question as it can seem to be.
UPDATE:
I really want to try to avoid using subqueries or if doing so - use it the optimal may. What I came with currently is something like this:
SELECT
ordered_by_date.item_discuss_thread_id
, item_discuss_post_title
, COUNT(item_discuss_thread_id) AS nb_posts
FROM
(
SELECT
item_discuss_thread_id
, item_discuss_post_title
FROM
item_discuss_posts
ORDER BY
item_discuss_post_datetime DESC
) AS ordered_by_date
GROUP BY
item_discuss_thread_id
EXPLAIN EXTENDED gives the following result:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, PRIMARY, <derived2>, ALL, \N, \N, \N, \N, 20, Using temporary; Using filesort
2, DERIVED, item_discuss_posts, index, \N, item_discuss_post_datetime, 8, \N, 20,
Upvotes: 1
Views: 601
Reputation: 2430
Ok, I came with solution myself. I used a dependent subquery to solve. This is what I have in the result:
SELECT
item_discuss_threads.item_discuss_thread_id
, item_discuss_threads.item_discuss_thread_datetime
, item_discuss_threads.item_discuss_thread_title
, latest_posts.item_discuss_post_title
, latest_posts.item_discuss_post_datetime
, COUNT(item_discuss_posts.item_discuss_post_id) AS nb_posts
FROM
item_discuss_threads
INNER JOIN item_discuss_posts
ON item_discuss_threads.item_discuss_thread_id=item_discuss_posts.item_discuss_thread_id
INNER JOIN item_discuss_posts AS latest_posts
ON latest_posts.item_discuss_thread_id=item_discuss_threads.item_discuss_thread_id
WHERE
(
SELECT
item_discuss_post_id
FROM
item_discuss_posts AS p
WHERE
p.item_discuss_thread_id=item_discuss_posts.item_discuss_thread_id
ORDER BY
item_discuss_post_datetime DESC
LIMIT
1
)=latest_posts.item_discuss_post_id
GROUP BY
item_discuss_threads.item_discuss_thread_id
ORDER BY
latest_posts.item_discuss_post_datetime DESC
Upvotes: 2
Reputation: 11244
Try this.
SELECT
*
FROM
(SELECT item_discuss_thread_id, item_discuss_post_title, COUNT(item_discuss_thread_id) AS nb_posts
FROM item_discuss_posts
ORDER BY __datecolumn__)
AS ordered_by_date
GROUP BY
ordered_by_date.item_discuss_thread_id
Replace __datecolumn__
with the column that stores posting time.
Upvotes: 1