2011-07-02 51 views
1

18種類のWordpressデータベースから1つのデータベースにマージされた結果を取り込み、の名前が衝突しているかどうかを尋ねられます。例えば同じ構造の異なるテーブルの結果を取得する

私は(それらのすべてが彼らの列名にPOST_NAME、post_type、post_statusとpost_dateを持つテーブルです)ara_posts、val_posts、およびcar_postsのデータ(記事を)持っています。私はそれらのテーブルからすべてのデータを選択し、結果をフィルタリングしたい(post_type = 'post'の結果のみを表示する)。

私が結果としてしたいのは、日付を比較し、ステータスが「公開」で、投稿タイプが「投稿」である18個のすべてのテーブルから最新の3つの投稿を取得することです。

どうすれば可能ですか?

+0

最新の3個(3×18行)またはすべてのテーブルの最新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もっと同意できませんでした。私は間違った表現を使用したかもしれないと思う - 私にとっては "maintanable"コードではないようだ。提案はありませんか? – AeroCross

1

そして、あなたが知っているので、あなただけのデータが来ているデータベースから選択するために、手動で列を追加できます:私はすべてのサブクエリ内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 
1

。この方法では、すべてのサブクエリは対応するテーブルの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

関連する問題