2013-04-06 78 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