【发布时间】:2013-04-06 22:25:07
【问题描述】:
我在 MySQL 中有几个具有不同架构的不同表,但所有表都有一个自动递增的 ID 和一个时间戳(更准确地说,列名是 datetime 类型的“create_timestamp”)。
为了给这个问题提供更多背景信息,我正在构建一个社交数据聚合器,而我的 MySQL 数据库只是来自社交媒体 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 条最新记录的最佳选择。然后从这个查询的结果中获取信息。
-
谢谢!以前从未使用过 UNION,但看起来它可以完成工作。