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

时间:2011-07-02 21:29:42

标签: php mysql sql wordpress

我被问到是否可以将18个不同的Wordpress数据库中的结果合并到一个数据库,名称冲突,过滤它们,然后在PHP中使用结果。

例如:

我在ara_posts,val_posts和car_posts中有数据(帖子)(所有这些都是在列名中包含post_name,post_type,post_status和post_date的表)。我想从这些表中选择所有数据并过滤结果(仅显示具有post_type ='post'的结果)。

我想要对结果做的是比较日期并从所有18个表中获取最新的3个帖子,这些帖子的状态为“发布”,帖子类型为“帖子”。

这怎么可能?

4 个答案:

答案 0 :(得分:2)

正如对this question quite similar to yours的回答中提出的那样,您可以使用UNION运算符。像这样:

(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

答案 1 :(得分:1)

您可以在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 

答案 2 :(得分:1)

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

如果您只有主要查询,则必须获取所有(数千万?)行然后排序。我不确定优化器是否足够聪明,不能这样做:

( 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

丹尼斯非常关注如何确定最终结果的来源。

答案 3 :(得分:1)

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