1

MySQL には異なるスキーマを持ついくつかの異なるテーブルがありますが、すべてのテーブルには自動インクリメントされた ID とタイムスタンプがあります (より正確には、列名は datetime 型の「create_timestamp」です)。

この質問にさらに詳しい説明を加えるために、私はソーシャル データ アグリゲーターを構築しており、MySQL DB はソーシャル メディア API からキャッシュされたデータにすぎません。したがって、テーブルは Instagram、Youtube ビデオ、ツイートなど用です。私の目標は、create_time に基づいて、これらのそれぞれの組み合わせから合計 20 レコードをクエリすることです。各メディア API は異なるデータを返すため、各テーブルのスキーマは大きく異なります。

擬似コードでは、これを達成しようとしています:

SELECT * FROM instagrams, tweets, youtube_videos, tumblr_posts ORDER BY create_time DESC LIMIT 20;

すべての ID とテーブルの種類を照会し、PHP でこれらをループして個々のデータを取得する必要があるかもしれないことに気付きました。たとえば、より多くの疑似コード:

MySQL

SELECT id, table_name FROM instagrams, tweets, youtube_videos, tumblr_posts ORDER BY create_time DESC LIMIT 20;

PHP

-For each result from that query as $row, query for:
SELECT * FROM $row["table_name"] WHERE id=$row["id"]

このデータを PHP アプリに取り込むための最良かつ最も効率的な方法は何ですか?


更新

ダンに感謝します。UNION を使用して、ID とテーブル名を選択するために思いつきました。

SELECT id, create_timestamp, "instagrams" as "table_name" FROM instagrams
UNION
SELECT id, create_timestamp, "tumblr_posts" as "table_name" FROM tumblr_posts
UNION
SELECT id, create_timestamp, "wordpress_posts" as "table_name" FROM wordpress_posts
UNION
SELECT id, create_timestamp, "tweets" as "table_name" FROM tweets
UNION
SELECT id, create_timestamp, "youtube_videos" as "table_name" FROM youtube_videos
UNION
SELECT id, create_timestamp, "manual_photo" as "table_name" FROM manual_photo
ORDER BY create_timestamp DESC
LIMIT 20

次に、PHP でループして、個々のレコードを一度に 1 つずつクエリします。

4

1 に答える 1

0

サブクエリを使用して各テーブルの最新の 20 エントリを取得し、外側のクエリを使用して和集合から最新の 20 エントリを取得します。PHPでテーブル名が必要な場合は、テーブル名をselect句に入れるだけです。

あなたが言ったように、テーブルには異なる「スキーム」があるため、各テーブルの select * を単にユニオンすることはできません。

select * from (
    (select 'instagram' as table, id, create_time from instagram order by create_time desc limit 20)
    union
    (select 'tweets' as table, id, create_time from tweets order by create_time desc limit 20)
    union
    (select 'youtube_videos' as table, id, create_time from youtube_videos order by create_time desc limit 20)
    union
    (select 'tumblr_posts' as table, id, create_time from tumblr_posts order by create_time desc limit 20)
)t
order by create_time
limit 20
于 2013-04-06T22:46:31.717 に答える