0

从过去几个小时开始,我几乎被困在一个 Sql 查询中。我需要从四个表中获取最新的几个元素,如下所示.. 表名是——事件、联系信息、视频、新闻

我需要来自事件和新闻的最后 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 真的不太了解。任何帮助,将不胜感激。

4

3 回答 3

0

这不是一次调用获得四个表数据的逻辑方式,因为所有表都是独立的。

我想你想尽量减少数据库调用,

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

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

于 2013-11-10T16:14:23.177 回答
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 行(前 5 行是 MS SQL 语法,请使用您的数据库)。我还添加了一个额外的字段 SourceType 来保持实体的类型。在主查询中,我首先按源类型合并所有结果和排序,然后按 CreatedDate。

于 2013-11-10T15:01:07.073 回答
0

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

JOINs 表明连接的数据相互关联,如果不是这种情况,那么执行 JOIN 接缝就像错误的解决方案一样。

于 2013-11-10T14:54:53.073 回答