2016-07-28 55 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