给定两个表,从一个表中选择所有数据,从另一个表中选择最新数据

时间:2016-12-05 17:27:01

标签: mysql

我正在尝试建立一个论坛网站,该网站使用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。

2 个答案:

答案 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