我被问到是否可以将18个不同的Wordpress数据库中的结果合并到一个数据库,名称冲突,过滤它们,然后在PHP中使用结果。
例如:
我在ara_posts,val_posts和car_posts中有数据(帖子)(所有这些都是在列名中包含post_name,post_type,post_status和post_date的表)。我想从这些表中选择所有数据并过滤结果(仅显示具有post_type ='post'的结果)。
我想要对结果做的是比较日期并从所有18个表中获取最新的3个帖子,这些帖子的状态为“发布”,帖子类型为“帖子”。
这怎么可能?
答案 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)部分定义一个视图。然后,您可以直接查询视图。视图是函数的模拟 - 它是数据库重用的基本单位。