我在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应用程序的最佳和最有效的方法是什么?



更新:

谢谢Dan,使用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中,我一次遍历并查询其单个记录。

最佳答案

使用子查询获取每个表的最新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

关于php - 从具有不同架构的多个MySQL表中选择ID和时间戳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15856724/

10-11 14:36