2011-07-02 187 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

相關問題