Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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 从具有相同结构的不同表中获取结果_Php_Mysql_Sql_Wordpress - Fatal编程技术网

Php 从具有相同结构的不同表中获取结果

Php 从具有相同结构的不同表中获取结果,php,mysql,sql,wordpress,Php,Mysql,Sql,Wordpress,有人问我是否可以从18个不同的Wordpress数据库中获取合并到一个名称冲突的数据库中的结果,对它们进行过滤,然后在PHP中处理结果 例如: 我在ara_posts、val_posts和car_posts中都有数据发布,它们都是列名称中包含post_名称、post_类型、post_状态和post_日期的表。我想从这些表中选择所有数据并过滤结果,只显示post类型为'post'的结果 我想对结果做的是比较日期并从所有18个表中获取最新的3篇文章,这些表的状态为publish,文章类型为post

有人问我是否可以从18个不同的Wordpress数据库中获取合并到一个名称冲突的数据库中的结果,对它们进行过滤,然后在PHP中处理结果

例如:

我在ara_posts、val_posts和car_posts中都有数据发布,它们都是列名称中包含post_名称、post_类型、post_状态和post_日期的表。我想从这些表中选择所有数据并过滤结果,只显示post类型为'post'的结果

我想对结果做的是比较日期并从所有18个表中获取最新的3篇文章,这些表的状态为publish,文章类型为post


这怎么可能呢?

正如在对的回答中所建议的,您可能可以使用运算符。大概是这样的:

(SELECT post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(SELECT post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3

正如在对的回答中所建议的,您可能可以使用运算符。大概是这样的:

(SELECT post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(SELECT post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3

您可以只在select中添加一个手动列,以便知道数据来自哪个数据库:

(SELECT 'ara' as dbname, post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT 'val' as dbname, post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL (...) ORDER BY post_date DESC LIMIT 3 

您可以只在select中添加一个手动列,以便知道数据来自哪个数据库:

(SELECT 'ara' as dbname, post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT 'val' as dbname, post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL (...) ORDER BY post_date DESC LIMIT 3 
我会在所有子查询中添加ORDER BY post_date DESC LIMIT 3部分。这样,所有子查询都将使用对应表的post_date字段的索引,主查询只需对18x3行进行排序

如果主查询中只有该tin,那么它必须获取所有数千个tin?数以百万计的?行,然后排序。我不确定优化器是否足够聪明,不会这样做:

( SELECT post_name, post_type, post_status, post_date, 'ara' AS source 
  FROM ara_posts 
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
( SELECT post_name, post_type, post_status, post_date, 'val' AS source 
  FROM val_posts
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3
Dennis在如何确定最终结果的来源方面有很好的观点。

我会在所有子查询中添加ORDER BY post_date DESC LIMIT 3部分。这样,所有子查询都将使用对应表的post_date字段的索引,主查询只需对18x3行进行排序

如果主查询中只有该tin,那么它必须获取所有数千个tin?数以百万计的?行,然后排序。我不确定优化器是否足够聪明,不会这样做:

( SELECT post_name, post_type, post_status, post_date, 'ara' AS source 
  FROM ara_posts 
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
( SELECT post_name, post_type, post_status, post_date, 'val' AS source 
  FROM val_posts
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3

Dennis在如何确定最终结果的来源方面有很好的观点。

我会根据其他答案中的联合查询定义一个视图,但没有where和limit部分。然后可以直接查询视图。视图是功能的模拟-它是数据库重用的基本单位。

我将根据其他答案中的联合查询定义一个视图,但不包括where和limit部分。然后可以直接查询视图。视图是函数的模拟-它是数据库重用的基本单位。

每个so 3x18行中的最新3个或所有表中的最新3个?@ypercube根据所有表的GMT,是最新的3个-它将获取帖子,然后比较最新的GMT发布日期,不管是哪个表。每个so 3x18行中的最新3个还是所有表中的最新3个?@ypercube根据所有表的GMT确定最新3个-它将获取帖子,然后比较哪个表具有最新的GMT发布日期。这似乎可行,但在代码方面完全没有效率,因为如果我必须为每个查询复制/粘贴18个精确的查询,我说的对吗如果我想更改其中一个查询中的where子句,我必须手动为所有查询更改where子句。对我来说似乎不是最好的。@ypercube完全同意。我想我可能使用了错误的表达式-对我来说似乎不可维护的代码。你没有任何建议吗?@AeroCross:你可以使用PHP代码生成SQL查询,将相同的部分条件、顺序、限制添加到18个子查询中。这看起来确实有效,但在代码方面效率完全低下,因为如果我必须为每个查询复制/粘贴18个精确的查询,我说得对吗如果我想更改其中一个查询中的where子句,我必须手动为所有查询更改where子句。对我来说似乎不是最好的。@ypercube完全同意。我想我可能使用了错误的表达式-对我来说似乎不可维护的代码。您没有任何建议吗?@AeroCross:您可以使用PHP代码生成SQL查询,在18个子查询中添加相同的部分条件、顺序和限制。这绝对是一个很好的建议。我会让你知道一切进展顺利。这绝对是一个很好的建议。我会让你知道一切进展顺利。