【问题标题】:Select latest topic from a category (SQL and PHP)从类别中选择最新主题(SQL 和 PHP)
【发布时间】:2016-07-28 00:20:24
【问题描述】:

我希望能够通过 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_description

主题

  • topic_id
  • 主题名称
  • 主题日期
  • topic_cat
  • topic_by

【问题讨论】:

  • 请张贴您的表格结构。
  • @RobertColumbia 我已经发布了它们,这些信息是否足够?如果您需要更多,请询问我。

标签: php mysql sql


【解决方案1】:

更新

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

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

【讨论】:

  • 非常简单的答案!就像我想要的那样工作。也感谢现场演示。
  • 是否有任何理由使用LEFT JOIN 而不是JOIN
  • @ZacharyVincze 看到我更新的答案。我还包含了一个演示,如果一个类别没有匹配的主题,LEFT JOIN 的样子
猜你喜欢
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多