Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从按时间排序的多个表中获取最后30项?_Php_Mysql_Sql - Fatal编程技术网

Php 如何从按时间排序的多个表中获取最后30项?

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

我有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 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中没有顶级功能