具有相同结构的不同表格获取结果
我被问到是否可以从18个不同的Wordpress数据库合并到一个数据库中,并且名称冲突,过滤它们,然后在PHP中播放结果。具有相同结构的不同表格获取结果
例如:
我在ara_posts,val_posts数据(职位),和car_posts(所有的人都认为在其列名POST_NAME,post_type,post_status和POST_DATE表)。我想从这些表中选择所有数据并过滤结果(仅显示具有post_type ='post'的结果)。
我想要做的结果是比较日期并从所有这18个表中获取最新的3个帖子,他们的状态为“发布”,帖子类型为“发布”。
这怎么可能?
正如对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
,你可能只需要添加人工列的选择,所以你知道从哪个数据库中的数据来了:
(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行进行排序。
如果您只有主查询,它将不得不提取所有(数千?百万?)行,然后进行排序。我不知道优化器是足够聪明不这样做:
(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
和丹尼斯对如何识别最终结果的来源一个很好的点。
确实很不错。 – Viktor
我会根据其他答案(但没有where和limit)部分中的联合查询定义视图。然后你可以直接查询视图。视图是功能的模拟 - 它是数据库重用的基本单位。
这是一个很好的建议。我会让你知道我一切顺利。 – AeroCross
每个(所有3x18行)或所有表中最新的3个最新的3个? –
@ypercube所有表格的最新3(根据GMT) - 它将获取帖子,然后比较哪个具有最新的GMT发布日期,无论是哪张表。 – AeroCross