mysql - 我如何编写这个涉及连接的简单 sql 语句?

标签 mysql sql join inner-join greatest-n-per-group

类别表:

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| cat_id          | int(8)       | NO   | PRI | NULL    | auto_increment |
| cat_name        | varchar(255) | NO   | UNI | NULL    |                |
| cat_description | varchar(255) | NO   |     | NULL    |                |
| cat_order       | int(8)       | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

主题表:

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| topic_id      | int(8)       | NO   | PRI | NULL    | auto_increment |
| topic_subject | varchar(255) | NO   |     | NULL    |                |
| topic_date    | datetime     | NO   |     | NULL    |                |
| topic_cat     | int(8)       | NO   | MUL | NULL    |                |
| topic_by      | int(8)       | NO   | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

topic_cat 对应外键关系中的cat_id。

我如何编写一个返回的 sql 语句:每个类别的最新主题加上类别名称???

这是我目前所拥有的:

SELECT * FROM categories 
LEFT JOIN
   (SELECT topic_id, topic_subject, max(topic_date) AS MaxDate, topic_cat, topic_by 
   FROM topics 
   GROUP BY topic_subject) AS mt 
ON categories.cat_id = mt.topic_cat 
ORDER BY cat_order;

它返回同一类别的多个主题,而我只希望每个类别有一个主题。

最佳答案

当您尝试获取 ,您需要连接回原始表 (topics) 以选择具有最大日期的行。因为仅在子查询中提及 MAX(topic_date) 不会使 other 列来自找到最大日期的行。如果您还提到 MIN(topic_date) 怎么办?

这应该是一个解决方案(虽然我还没有测试过):

SELECT *
FROM topics AS t
JOIN (SELECT topic_cat, MAX(topic_date) AS topic_date
      FROM topics
      GROUP BY topic_cat) AS maxt USING (topic_cat, topic_date)
RIGHT JOIN categories AS c ON t.topic_cat = c.cat_id

关于mysql - 我如何编写这个涉及连接的简单 sql 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23923128/

相关文章:

php - Laravel更新数据库表设计

php - 如何让这个 PHP/MySQL 游戏 map 更加高效?

c# - SQL 代码比 C# 代码快吗?

mysql - 在 Perl DBI 模块中,指定任务的两种方法中哪一种在性能方面更好?

mysql - 有一个表的其中一列大部分为空或创建一个新表并引用它是否更有效?

sql - 在 Oracle 中连接表(多个外连接)

mysql - 计算字符串中唯一字符的数量

mysql - 每个城市的最近一年和项目

MYSQL错误和连接语句

mysql - SQL-连接表并检查是否存在不工作/语法不正确的内容