我正在尝试建立一个论坛网站,该网站使用PHP和MySQL数据库来存储其类别和主题内容。在主页上,我希望有一个表格,显示所有类别的列表以及每个类别中最新发布的主题。
我想编写一个查询,该查询返回类别表中的所有类别,并且只返回主题表中每个类别的最新主题。
我的表格如下:
类别
+--------+-------------+--------------------------+
| cat_id | cat_name | cat_description |
+--------+-------------+--------------------------+
| 1 | Automobiles | *Tim Taylor manly grunt* |
| 2 | English | How to English |
| 3 | Gardening | Lawn and Order |
+--------+-------------+--------------------------+
主题
+----------+-----------------------+------------------------+-----------+----------+
| topic_id | topic_name | topic_content | topic_cat | topic_by |
+----------+-----------------------+------------------------+-----------+----------+
| 1 | '67 Chevy Question | Weird knocking noise? | 1 | 1 |
| 2 | You're vs Your | What's the difference? | 2 | 3 |
| 3 | Jumper cables? | The proper hookup | 1 | 2 |
| 4 | '03 Pathfinder | Next newest model? | 1 | 1 |
| 5 | There, Their, They're | Know the difference | 2 | 4 |
+----------+-----------------------+------------------------+-----------+----------+
我在特技#3下的https://stackoverflow.com/a/12586263/7249891找到了一个相关的答案,但经过几个小时的摆弄后,我无法将其归结为适合我的查询。
我的问题是,如何调整原始查询
SELECT c.cat_name AS Category, t.topic_cat AS Recent Topic
FROM categories c
JOIN topics t
WHERE c.cat_id = t.topic_cat
所以它返回数据库中的所有类别,但只返回与此类似的结果中每个类别的最新主题
+-------------+-----------------------+
| Category | Recent Topic |
+-------------+-----------------------+
| Automobiles | '03 Pathfinder |
| English | There, Their, They're |
| Gardening | NULL |
+-------------+-----------------------+
澄清: 在此论坛中,管理员创建了几个类别,任何用户都可以在其中发布主题。
在主题中,主题主题是用户提出的问题,主题内容是有关该问题的其他信息。
Cat_id和topic_id都是自动递增主键。
Topic_subject是一个引用cat_id的外键。
假设主题表中最新的主题是具有最高topic_id编号的主题,因为主键行为。此表中还有一个日期字段(我在最后一刻意识到我忘了包含在这里)。
我还没有列出其他两个表:用户和回复表。 Topic_by是引用users表的外键。
如果某个类别中没有主题(上面例子中的园艺类别),我们假设程序的PHP部分会使列表的那一部分说“"(无)&#” 34。
答案 0 :(得分:0)
首先找到每个类别中的最新帖子:
select topic_cat, max(topic_id) as latest_topic
from topics group by topic_cat
然后将其添加到您的加入条件中:
SELECT c.cat_name AS Category, t.topic_name AS Recent_Topic
FROM categories c
left JOIN topics t on c.cat_id = t.topic_cat
left join (select topic_cat, max(topic_id) as latest_topic
from topics group by topic_cat) as latest_topics
on latest_topics.topic_cat = c.cat_id
and latest_topics.latest_topic = t.topic_id
where latest_topics.topic_cat is not null or t.topic_cat is null;
答案 1 :(得分:0)
首先从topic_cat中选择具有max id group的topics
个表中的行,并使用categories table进行左连接。
<强>查询强>
select a.`cat_name`,
b.`topic_name` as `Recent Topic`
from `categories` a
left join(
select t1.`topic_id`,
t1.`topic_name`,
t1.`topic_content`,
t1.`topic_cat`,
t1.`topic_by` from
(
select `topic_id`,
`topic_name`,
`topic_content`,
`topic_cat`,
`topic_by`,
(
case `topic_cat` when @curA
then @curRow := @curRow + 1
else @curRow := 1 and @curA := `topic_cat` end
) as `rn`
from `topics` t,
(select @curRow := 0, @curA := '') r
order by `topic_cat`, `topic_id` desc
)t1
where t1.`rn` = 1
)b
on a.`cat_id` = b.`topic_cat`;
的 SQL Fiddle Demo
强> 的