2011-07-02 133 views
1

我被问到是否可以从18个不同的Wordpress数据库合并到一个数据库中,并且名称冲突,过滤它们,然后在PHP中播放结果。具有相同结构的不同表格获取结果

例如:

我在ara_posts,val_posts数据(职位),和car_posts(所有的人都认为在其列名POST_NAME,post_type,post_status和POST_DATE表)。我想从这些表中选择所有数据并过滤结果(仅显示具有post_type ='post'的结果)。

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

这怎么可能?

+0

每个(所有3x18行)或所有表中最新的3个最新的3个? –

+0

@ypercube所有表格的最新3(根据GMT) - 它将获取帖子,然后比较哪个具有最新的GMT发布日期,无论是哪张表。 – AeroCross

回答

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 
+0

这似乎工作,但它是完全低效的代码,因为如果我将不得不复制/粘贴每个查询18确切查询我需要做的,我是对吗? - 如果我想更改其中一个查询中的“where”子句,则必须手动为其中的所有查询执行此操作。对我来说看起来并不理想。 – AeroCross

+0

@AeroCross:较少的代码并不意味着最佳。 –

+0

@ypercube不能同意更多。我想我可能使用了错误的表达方式 - 对我来说似乎没有“可靠的”代码。你有什么建议吗? – AeroCross

1

,你可能只需要添加人工列的选择,所以你知道从哪个数据库中的数据来了:

(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 
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 

和丹尼斯对如何识别最终结果的来源一个很好的点。

+0

确实很不错。 – Viktor

1

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

+0

这是一个很好的建议。我会让你知道我一切顺利。 – AeroCross

相关问题