类别表:
+-----------------+--------------+------+-----+---------+----------------+
| 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;
它返回同一类别的多个主题,而我只希望每个类别有一个主题。
最佳答案
当您尝试获取 greatest-n-per-group ,您需要连接回原始表 (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/