mysql从每个类别的表中获取最新文章

mysql从每个类别的表中获取最新文章,mysql,Mysql,我在tintuc项目工作 我有两张像这样简单的桌子 table articles ID - Title - Des - CatID table category CatID - catTitle 通常我会在类别表上运行一个循环,以接收CatID和catTile,然后在文章表上再次运行一个循环,以获得属于该CatID的4篇最新文章 这样的网站上的结果 我认为在类别表上循环,然后在每个catId的文章表上循环很多次是没有效果的 请帮助最有效的mysql查询以获得相同的结果 非常感谢。您无法以

我在tintuc项目工作

我有两张像这样简单的桌子

table articles
 ID - Title - Des - CatID
table category
 CatID - catTitle 
通常我会在类别表上运行一个循环,以接收CatID和catTile,然后在文章表上再次运行一个循环,以获得属于该CatID的4篇最新文章

这样的网站上的结果 我认为在类别表上循环,然后在每个catId的文章表上循环很多次是没有效果的

请帮助最有效的mysql查询以获得相同的结果


非常感谢。

您无法以您提到的格式获得结果,但是,您可以运行此查询并循环结果,以将数据格式化为您上面所示的格式

SELECT c.catTitle, c.CatID, a.Title, a.ID , a.Des
FROM category c, artices a
WHERE c.CatID  = a.CatID 
ORDER BY c.CatID ASC, a.ID DESC
编辑:

如果您只想要前4名,请使用此查询

SELECT c.catTitle, c.CatID, a.Title, a.ID , a.Des
FROM category c, (SELECT ID, Title, Des, CatID
FROM
(
   SELECT ID, Title, Des, CatID,
      @num := if(@CatID = `CatID`, @num + 1, 1) AS row_number,
      @CatID := `CatID` AS dummy
  FROM articles
  ORDER BY CatID, ID DESC
) AS x WHERE x.row_number <= 4) a
WHERE c.CatID  = a.CatID
ORDER BY c.CatID ASC, a.ID DESC
如果ID是您排序的依据,我看不到要排序的文章日期,那么查询可以写为

SELECT a.* FROM articles a
WHERE (
   SELECT COUNT(b.id) FROM articles b WHERE a.id < b.id AND a.CatID = b.CatID
) < 4;
它显示同一类别中存在少于4篇较新文章的所有文章


.

谢谢,但这看起来并没有限制每个catid上的文章数。我只需要显示4篇文章,所以与3类将有12行的结果。谢谢。。我刚刚用我们的数据测试了你的查询。。大约60万行。。这花了很长时间,有一段时间超过了sql运行时的限制。@BinhNguyen您需要在列上建立索引以加快进度。如CatID列。通常是WHERE或JOIN子句中经常使用的任何列。感谢您的查询,查询时间很短,但也花了很长时间。。在我们的数据中,有60万行数据。@BinhNguyen表中有索引吗?特别是在article.CatID和article.id上?是的,它们都有articleid和CatID的索引栏。。现在我不得不回到过去。。列出所有类别,然后逐个循环,从每个类别中获得最新的4个艺术。。
SELECT a.* FROM articles a
WHERE (
   SELECT COUNT(b.id) FROM articles b WHERE a.id < b.id AND a.CatID = b.CatID
) < 4;