Php 如何从按时间排序的多个表中获取最后30项?
我有3个表格可以从中获取信息:Php 如何从按时间排序的多个表中获取最后30项?,php,mysql,sql,Php,Mysql,Sql,我有3个表格可以从中获取信息: 文章 职位 照片 所有这些表都有“created_at”列 我想在抛出sql查询的列中获取由创建的_排序的最后30个项目, 在最坏的情况下,我必须从任何表中弹出30个项目,并通过php代码从数组中排序。类似于: SELECT * FROM (SELECT * FROM articles UNION SELECT * FROM posts UNION SELECT * FROM pictures) ORDER BY created_at DESC LIMIT
- 文章
- 职位
- 照片
SELECT * FROM
(SELECT * FROM articles UNION SELECT * FROM posts UNION SELECT * FROM pictures)
ORDER BY created_at DESC LIMIT 30
几乎可以肯定的是,您需要将*
替换为您要选择的两个表共有的字段列表(例如,ID),或者还需要一些东西来标识对象的类型(例如,选择a、b、'article'作为项类型
)
请小心放置where
子句的位置。理想情况下,您可以在每个内部选择上放置一个,以限制其中包含的对象,而不是在外部放置一个必须等待整个联合
操作首先执行的大量
Select top 30 * from
(select acticles.created_at, ID
from articles
UNION
select posts.created_at, ID
from posts
UNION
select pictures.created_at, ID
from pictures
ORDER BY 1)
像这样的东西怎么样:
(SELECT * FROM articles)
UNION
(SELECT * FROM posts)
UNION
(SELECT * FROM pictures)
ORDER BY created_at DESC
LIMIT 30
这是未经测试的,但应该有效。确保将“*”更改为您正在使用的任何字段。基于过去的答案,并在此处添加一点优化:
SELECT created_at, tbl, id, name, author_id FROM
(SELECT created_at, "articles" as tbl, id, name, author_id
FROM `articles` ORDER BY created_at DESC LIMIT 30
UNION
SELECT created_at, "posts" as tbl, id, name, author_id
FROM `posts` ORDER BY created_at DESC LIMIT 30
UNION
SELECT created_at, "pictures" as tbl, id, name, author_id
FROM `pictures` ORDER BY created_at DESC LIMIT 30
)
ORDER BY created_at DESC LIMIT 30;
FWIW-这是未经测试的,可能包含愚蠢的错误
我首先假设创建的_at在所有三个表上都建立了索引。
我还将限制每个表只返回“最后30项”,这样我们就不会在一个潜在的巨大派生表上排序(在这个派生表中我们无法索引)
因此,派生表上的最终“order by”保证排序JOIN
有什么帮助?您也许可以设计一些复杂的交叉联接,让您能够识别所有三个表中最近的30个项目,但这并不是最优雅(或最有效)的方法JOIN
在这里根本不是合适的工具。我的表有一些相同的字段,如(id、name、author_id),但也有一些不相同的字段。这要求所有3个表都有完全相同的列,不是吗?我想Lotus是对的,如果我有一些不相同的字段,我无法执行此查询。请明确说明要包含的列,而不是使用*来避免此问题。这正是为什么我说“您需要将*
替换为要选择的两个表的公共字段列表”。对于某些行,不存在返回某些字段而对于其他行返回不同字段的查询。如果希望获得所有字段,唯一的方法就是SELECT*,NULL为x,NULL为y,NULL为z
填充所有三个表中的所有额外字段,这样就可以得到大量包含大量NULL的列。正如你所能想象的那样,这很难看,所以通过只选择你需要的东西来避免它是最好的。我认为mysql中没有顶级功能