1

私はこれに苦労しています.スタックオーバーフローに似たような質問がいくつかありますが、正しい解決策が見つかりません. 私は 3 つのテーブルを持っています:categories, topicsそしてposts、それらを結合して、各カテゴリを、何かが投稿されcategoriesた最新のトピックの件名と一緒に表示したい場所topicsと、最後に投稿がpostsテーブルから投稿された最新の日付を表示します。

各カテゴリから最新の投稿レコードを取得できないことを除いて、すべてを希望どおりに表示することに成功しました。

クエリは次のとおりです。

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = ( SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id ) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC

topic_id句の中のWHEREが探しているものではないということと関係があるはずだと思います。このような別のもの:

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat AND t.topic_id = ( SELECT post_topic FROM posts ORDER BY UNIX_TIMESTAMP(post_date) DESC LIMIT 1 ) 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = ( SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id ) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC

明らかに、最新の投稿全体が含まれるカテゴリの適切な投稿のみが表示されます。すべてのカテゴリの最新の投稿を取得するにはどうすればよいですか?

4

2 に答える 2

1
SELECT c.cat_id, c.cat_name, c.cat_description, tp.topic_subject, tp.topic_id, tp.maxPostDate
FROM categories c 

LEFT JOIN (select t.topic_cat,t.topic_subject,t.topic_id, max(post_date) maxPostDate  from topics t
           LEFT JOIN posts p ON p.post_topic = t.topic_id
           group by t.topic_cat,t.topic_subject,t.topic_id) tp
on (c.cat_id=tp.topic_cat)


where tp.maxPostDate = (select max(post_date) from topics t2
                       LEFT JOIN posts p2 ON p2.post_topic = t2.topic_id
                       where t2.topic_cat=c.cat_id
                       )


ORDER BY UNIX_TIMESTAMP(tp.maxPostDate) DESC

注: このクエリは、たとえば、最大投稿日が同じ 2 つの異なるトピックがある場合、1 つのカテゴリに対して 2 行を出力できます。

于 2012-08-10T12:35:37.623 に答える
0

まず、Selectクエリでは、GROUPBY句に含めないフィールドにいくつかの集計関数を使用する必要があります。

今。各カテゴリの最大タイムスタンプを使用して投稿を取得するには、2段階のクエリを実行する必要があります。最初のステップでは、カテゴリの最大タイムスタンプを取得し、2番目のステップでは他のすべてのフィールドを取得します。はい、主キーとしてcat_id+timestampを使用します。同じcat_idに対していくつかの重複レコードを提供する可能性がありますが、リアルタイムで発生するのは非常に奇妙です。

コードは次のようになります。

SELECT c.cat_id, MAX( p.post_date ) as max_date
into #tmp_table
FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id 
GROUP BY c.cat_id 

SELECT * -- what you'll need
from #tmp_table as tmp
    LEFT JOIN categories as c on c.cat_id = tmp.cad_id
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = tmp.max_date
-- order by -- what you'll need

それは解決策です、より良いものがいいかもしれません。

于 2012-08-10T12:16:20.113 に答える