【问题标题】:Getting last few rows from more than one tables in MySql?从 MySql 中的多个表中获取最后几行?
【发布时间】:2013-11-10 14:38:20
【问题描述】:

从过去几个小时开始,我几乎陷入了 Sql 查询中。我需要从四个表中获取最新的几个元素,如下所示.. 表名是 -- events , contactinfo , video , news

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

【问题讨论】:

  • 完整的外部联接可能会为您提供答案。
  • INNER JOIN 只返回在表达式的 ON 子句中指定了相等键的行。
  • @Dan Bracuk 你的意思是说我应该用 FULL OUTER JOIN 替换内部联接 ..
  • 用完整的外部联接替换内部联接让您开始。您必须对那些 select * 做一些事情,以使您的结果集更具可读性。

标签: mysql sql join limit


【解决方案1】:

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

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

【讨论】:

  • 我也想过联合查询,但它不会提供所需的答案。 order by 和 limit 子句将适用于整个记录集,他需要每个表中的特定事件。
  • @DanBracuk 您可以将子查询与 LIMIT 联合在一起。
  • 我负担不起使用四个查询@Andreas Wederbrand,因为我使用的是 JDBC,并且有机会在没有任何通信的情况下通过四个查询存活下来。链接失败异常太少了。所以我必须只使用一个查询
  • @DanBracuk 他可以在每个查询中添加一个额外字段,根据数据源类型使用 1、2、3、4 个值,并将其包含在最终的 ORDER BY 中
【解决方案2】:

如果您需要将结果作为单个表,则使用 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。

【讨论】:

  • 那么你想要一个表还是多个结果?
  • 我希望它作为一个表,因为我无法运行四个查询.. 是否有可能:(
  • @user2273752 好吧,首先确定结果表中的确切内容。你觉得它看起来怎么样?根据这一点,您可以通过不同的方式解决问题。
  • 嘿@jim 我试过这个 SELECT * FROM (SELECT TOP 1 n.newsID AS id, n.newstitle AS FIRST , n.newsdesc AS SECOND, n.newsdate AS 第三, n.ndate AS 第四,n.visible AS 第五,NULL AS 第六 FROM News n ORDER BY newsid DESC) t1 UNION ALL SELECT * FROM (SELECT TOP 5 e.eventID AS id, e.eventname AS FIRST, e.eventdesc AS SECOND, e.eventtime AS第三,e.eventdate 作为第四,e.edate 作为第五,e.visible 作为第六 FROM EVENTS e ORDER BY eventid DESC) t2 ORDER BY id DESC
  • But This Error Comes 错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行使用“1 n.newsID as id, n.newstitle as first , n.newsdesc as second, n.newsdate as thi”附近的正确语法
【解决方案3】:

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

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

为了尽量减少数据库命中,您应该使用 memcache 而不是使用此类查询。

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

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2021-02-08
    • 2017-12-06
    相关资源
    最近更新 更多