从类别中选择最新主题(SQL和PHP)

时间:2016-07-28 00:20:25

标签: php mysql sql

我希望能够通过SQL查询选择发布到类别的最新主题。

我将使用两张桌子。

  • 类别
  • 主题

主题行知道它属于哪个类别,因为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

1 个答案:

答案 0 :(得分:3)

更新

这是一个更有效的查询,可以获得相同的结果。它会表现得更好,因为子查询与外部查询不相关(不使用任何数据)

init

Live demo

您询问了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 vs LEFT JOIN:第一个意味着如果任何类别没有主题,您仍然希望它包含在结果中。主题名称和日期仅为JOINnull表示您希望结果仅包含具有匹配主题的类别。所以你可以根据自己的喜好改变我的任何一个问题。

原始答案

这就是你需要的:

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

Live demo