2013-04-06 21 views
1

我有不同的模式在MySQL中有幾個不同的表,但所有的表都有一個自動遞增的ID和時間戳(更準確地說,列名是「create_timestamp」鍵入日期時間)。從不同模式的多個MySQL表中選擇ID和時間戳

爲了給這個問題更多的上下文,我正在構建一個社交數據聚合器,而我的MySQL DB只是來自社交媒體API的緩存數據。所以這些表格適用於Instagram,Youtube Videos,Tweets等。我的目標是根據他們的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應用程序的最佳和最有效的方法是什麼?


UPDATE

感謝丹,使用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

我認爲工會查詢是您最好的選擇,以獲得20個最新的記錄。然後從這個查詢的結果中獲取信息。 – 2013-04-06 22:27:15

+0

謝謝!之前從未使用過UNION,但看起來完成了工作。 – user1418227 2013-04-06 22:42:11

回答

0

使用子查詢獲取每個表的最新20個條目,並使用外部查詢從聯合集合中獲取最新的20個條目。如果您想在PHP中使用表名,只需將表名稱放在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