2016-07-28 53 views
3

我希望能夠通過SQL查詢選擇發佈到某個類別的最新主題。從類別中選擇最新主題(SQL和PHP)

我有兩張表,我打算使用。

  • 類別
  • 主題

的話題排知道它屬於哪個類別,因爲topics.topic_cat應該categories.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_id
  • TOPIC_NAME
  • topic_date
  • topic_cat
  • topic_by
+0

請發表您的表結構。 –

+0

@RobertColumbia我已經發布了他們,是否有足夠的信息?問我是否需要更多。 –

回答

3

更新

這是一種更有效的查詢,讓你同樣的結果。因爲子查詢是不相關的,將有更好的表現,從外部查詢

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 JOIN VS JOIN(不使用任何數據):第一個意思是如果有該類沒有話題,你仍然希望它包含在結果中。主題名稱和日期將只是nullJOIN表示您希望結果僅包含具有匹配主題的類別。所以你可以根據自己的喜好改變我的任何一個查詢。

原來的答覆

這是你所需要的:

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

雖然有什麼理由使用'LEFT JOIN'而不是'JOIN'? –

+0

@ZacharyVincze查看我更新的答案。如果某個類別沒有匹配的主題,我還包含了一個演示,說明「LEFT JOIN」的外觀 – BeetleJuice