2016-07-28 14 views
3

カテゴリに投稿された最新のトピックをSQLクエリで選択して選択できるようにします。カテゴリから最新のトピックを選択する(SQLとPHP)

私は2つのテーブルを使用しています。

  • カテゴリ
  • トピック

話題行がtopics.topic_catcategories.cat_idと一致する必要がありますので、それが属するどのカテゴリを知っています。

すべてのカテゴリをループして最新のトピックを表示したいと思います。このような感じです。

while($row = $result->fetch_assoc()) { 
    echo $row['cat_name'] . ' Latest Post is ' . $row['topic_name']; 
} 

これは、実行された場合の表示例です。

category1 Latest Post is "latest post" 
category2 Latest Post is "latest post" 
category3 Latest Post is "latest post" 

のように...

何SQLクエリ私はこれを選択するために使用することができますか?

私のテーブル構造は次のとおりです。

カテゴリ

  • CAT_ID
  • cat_name
  • cat_description

トピック

  • TOPIC_NAME
  • topic_date
  • topic_cat
+0

あなたのテーブル構造を投稿してください。 –

+0

@RobertColumbia私はそれらを掲示しました、十分な情報ですか?もっと必要な場合は私に尋ねてください。 –

答えて

3

更新

topic_byこれはあなたに同じ結果を取得し、より効率的なクエリであるtopic_id。サブクエリが無相関であるため、それはパフォーマンスが向上します

SELECT cat_name, topic_name, latest as topic_date 
FROM categories c 
LEFT JOIN ( 
    SELECT topic_name, topic_cat, MAX(topic_date) latest 
    FROM topics 
    GROUP BY topic_cat 
    ) as t 
ON c.cat_id = t.topic_cat 

Live demo

あなたはおよそLEFT JOINJOIN対を尋ねた外側のクエリから(任意のデータを使用していません):最初はつまりどのカテゴリにはトピックを持っていない場合それでも、あなたはそれを結果に含めることを望みます。トピック名と日付はnullになります。 JOINは、トピックに一致するカテゴリのみを結果に含めることを意味します。だから私のクエリのいずれかを好きなものに変更することができます。

オリジナル答え

これは何が必要です:

SELECT c.cat_name, t.topic_name, t.topic_date 
FROM categories c 
LEFT JOIN topics t ON c.cat_id=t.topic_cat 
WHERE topic_date = (
    SELECT MAX(t2.topic_date) 
    FROM topics t2 
    WHERE t2.topic_cat = t.topic_cat 
) 

このクエリは、各カテゴリからのみ、最新の話題を返します。

cat_name | topic_name | topic_date 

あなたのクエリを実行したら、あなたが望むように、あなたはあなたのループを実行することができます:各結果は、フィールドを持つ

while($row = $result->fetch_assoc()) { 
    echo $row['cat_name'] . ' Latest Post is ' . $row['topic_name']; 
} 

Live demo

+0

驚くほど簡単な答え!私の意図どおりに動作します。ライブデモにも感謝します。 –

+0

「JOIN」ではなく「LEFT JOIN」を使用する理由はありますか? –

+0

@ ZacharyVincze私の更新された答えを見てください。カテゴリに一致するトピックがない場合、LEFT JOINがどのように見えるかのデモを含めました – BeetleJuice

関連する問題