0

我在http://www.xaluan.com从事项目 tintuc

我有两张这样简单的桌子

table articles
 ID - Title - Des - CatID
table category
 CatID - catTitle 

通常我会在类别表上运行循环以接收 CatID 和 catTile,然后在文章表上再次运行循环以使 4 篇最新文章属于该 CatID

结果在这样的网站上

catTitle 1 
 - lastes article belong to catID 1
 - second last artice belong to catID 1
catTitle 2
 - lastess article belong to catID 2
 - second last article belong to catID 2

我认为循环遍历类别表然后在每个 catId 的文章表上循环多次不是有效的方式。

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

非常感谢。

4

2 回答 2

1

您无法以您提到的格式获得结果,但是,您可以运行此查询并循环遍历结果以格式化数据,使其看起来像上面显示的那样。

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

演示

于 2013-09-05T05:16:14.153 回答
0

如果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 篇新文章的所有文章。

一个用于测试的 SQLfiddle

于 2013-09-05T06:25:47.667 回答