从MySql中的多个表中获取最后几行?

时间:2013-11-10 14:38:21

标签: mysql sql join limit

在过去的几个小时里,我几乎陷入了一个Sql Query。我需要从四个表中获取最新的几个元素,如下所示。  表名是 - 事件,联系信息,视频,新闻

我需要事件和新闻的最后3个结果以及视频和联系信息的最后一个结果..

我尝试了以下查询,但正如预期的那样,它没有用..

SELECT  * FROM 
((SELECT * FROM EVENTS ORDER BY eventid DESC LIMIT 3)EV) INNER JOIN
((SELECT * FROM NEWS ORDER BY newsid DESC LIMIT 3)NE) INNER JOIN
((SELECT * FROM VIDEOS ORDER BY videoid DESC LIMIT 1)VI) INNER JOIN
((SELECT * FROM CONTACTINFO ORDER BY cid DESC LIMIT 1)AB);

其实我不是数据库专家,我是开发人员,我真的不太了解MySql。 任何帮助都会得到赞赏。

3 个答案:

答案 0 :(得分:0)

如果这些表具有相同的列,则可以执行UNION(而不是INNER JOIN)。如果没有,我建议做4个查询。

JOIN表示加入的数据彼此相关,如果不是这样,那么就像执行错误解决方案之类的JOIN接缝一样。

答案 1 :(得分:0)

如果您需要将结果作为单个表,则使用SELECT和UNION来联合数据,在每个查询中提供相同的列号及其数据类型(CAST列并在需要时提供默认值)。否则,如果您需要具有不同结构的结果,则运行4个查询 JOIN对您的任务没有意义,因为来自一个表的最后N行不太可能在另一个表的最后N行中具有相应的行。
更新
见例:

SELECT * FROM 
    (SELECT TOP 5 n.ID, n.Content, n.CreatedOn as CreatedOn, n.UserID as NewsUserID, 1 as SourceType FROM News n ORDER BY n.CreatedOn DESC) t1
UNION ALL
SELECT * FROM 
    (SELECT TOP 5 e.ID, e.Description as Content, e.CreatedAt as CreatedOn, NULL as NewsUserID, 2 as SourceType FROM Events e ORDER BY e.CreatedAt DESC) t2
ORDER BY SourceType, CreatedOn DESC

所以我决定从每个来源获得ID,Content和CreatedOn,并且还希望从News表中获得UserID。我构建了2个查询,因此它们返回相同数据类型的相同列。每个查询只从源代码中获取前5行(TOP 5是MS SQL语法,请使用您的数据库)。我还添加了一个额外的字段SourceType,它保留了实体的类型。在主查询中,我首先将所有结果和按源类型排序,然后按CreatedDate。

答案 2 :(得分:0)

这不是在一次调用中获取四个表数据的合理方法,因为所有表都是独立的。

我认为你想最小化数据库调用,

为了最大限度地减少数据库命中,您应该使用memcache而不是使用此类查询。

Memcache: 它将数据保存为键值对,对于每个键,您将获得结果集。 它非常快。