Mysql - LEFT JOIN - 获取第一个条目

Posted

技术标签:

【中文标题】Mysql - LEFT JOIN - 获取第一个条目【英文标题】:Mysql - LEFT JOIN - get first entry 【发布时间】:2014-10-10 09:38:24 【问题描述】:

mysql 中有这个结构

我想得到:

第一篇文章,来自最后一个主题,类别为“新闻”

在此示例中,它是来自帖子的行,其中 id = 2,如图像上标记的那样

到目前为止,我得到了这个查询:

SELECT *
FROM forum_post AS p 
LEFT JOIN forum_topic AS t ON p.topic_id = t.id
LEFT JOIN forum_category AS c ON t.category_id = c.id
WHERE c.title = 'News' AND t.id = MAX(t.id)
ORDER BY p.id ASC LIMIT 1

编辑:

肮脏的解决方案:

SELECT * FROM forum_post
WHERE topic_id = (SELECT MAX(id) FROM forum_topic WHERE category_id = 1)
ORDER BY id ASC LIMIT 1

【问题讨论】:

最后一个主题 = Max(Topic_Id) ? 是的,最后一个主题将始终位于表格末尾 @Ing.MichalHudak 查看 sqlfiddle.com 【参考方案1】:

您仍然可以使用联合查询而不是子查询来获取您类别的最后一个主题的第一篇文章,请注意,连接中的子查询将只运行一次以获取结果集,并且在您的情况下,子查询将为每次迭代运行

SELECT * FROM
forum_post AS p 
  JOIN 
    (SELECT 
      t.id 
    FROM
      forum_topic AS t 
      JOIN forum_category AS c 
        ON t.category_id = c.id 
    WHERE c.title = 'News' 
    ORDER BY t.id DESC 
    LIMIT 1) t
  ON p.topic_id = t.id 
ORDER BY p.id ASC 
LIMIT 1 

【讨论】:

【参考方案2】:
select fp.* from forum_post fp,
(select min(fp.id) from forum_post fp where topic_id in 
 (select max(ft.id) from forum_topic ft inner join forum_category fc 
     on fc.id = ft.category_id where fc.title = 'News'))T 
where fp.id = T.id

[如果没有论坛帖子,则不返回任何行]

编辑: 更新了【虽然没试过执行】

【讨论】:

#1052 - 字段列表中的列“id”不明确【参考方案3】:

我没有测试过,但应该是这样的:

SELECT fm.remply
FROM forum_topic ft
JOIN forum_category fc
    ON ft.category_id = fc.category_id
    AND fc.title = 'News'
JOIN forum_post fm
    ON ft.id = fm.topic_id
ORDER BY ft.id DESC
        ,fm.id DESC
LIMIT 1

【讨论】:

以上是关于Mysql - LEFT JOIN - 获取第一个条目的主要内容,如果未能解决你的问题,请参考以下文章

MySQL LEFT JOIN 不能处理多个表

Mysql LEFT JOIN -> 获取最新的主题id/主题标题

MySQL:LEFT JOIN .. 从表 1 中选择所有,即使表 2 中没有?

mysql关联left join条件on和where条件的区别及结合coalesce函数

MYSQL - 仅当 LEFT JOIN 中的行不存在时才选择

MySQL - 根据字段选择LEFT JOIN列的最后几行。