【发布时间】:2010-12-24 06:09:18
【问题描述】:
我的应用程序有一个类似 facebook 的流,显示各种类型的更新。因此它将显示常规帖子(来自“帖子”表)和事件(来自“事件”表)表等等。
问题是我不知道如何从不同的表中获取这些记录,因为它们有不同的列。我是否应该多次查询数据库,然后用 PHP 组织数据?如果是这样,如何?我不确定我应该如何处理这个问题。
非常感谢您的帮助:)
【问题讨论】:
-
UNION 是您正在寻找的神奇词汇。
我的应用程序有一个类似 facebook 的流,显示各种类型的更新。因此它将显示常规帖子(来自“帖子”表)和事件(来自“事件”表)表等等。
问题是我不知道如何从不同的表中获取这些记录,因为它们有不同的列。我是否应该多次查询数据库,然后用 PHP 组织数据?如果是这样,如何?我不确定我应该如何处理这个问题。
非常感谢您的帮助:)
【问题讨论】:
除非事件和帖子彼此相关,否则您可能会单独查询它们,即使它们显示在同一页面上。
您不会仅仅为了它而使用 JOIN。仅当存在外键关系时。如果你不知道那是什么,那你就没有。
【讨论】:
如果数据表彼此相关,您通常可以使用 JOIN 和 UNION 的某种组合在单个查询中获取数据。但是,为了获得更好的答案,您必须发布数据表的结构以及网站所需的(组合)记录样本。
【讨论】:
如果您不知道列,则可以获取表元数据并找出列代表什么以及它们对应的数据类型。
如果您知道哪些列,您可以从多个表中进行选择,甚至可以使用嵌套选择或连接来获取数据。
【讨论】:
理想情况下,您只需使用JOIN 在一个查询中从多个表中获取数据。但是,如果不了解更多关于表模式的信息,就很难提供任何有用的细节。 (除非您从一开始就考虑到这一点,否则这很可能是不可能的。)
因此,您可能还想创建一个通用的“元”表,以通用格式为每个帖子/事件提供信息,并提供链接到相关表的方法。 (即:它将包含“父”类型和 ID。)然后,您可以将此元表用作“更新”流的源,并根据需要向下钻取到适当的内容。
【讨论】:
加入 user_id 上的表,即
Select * from posts p
left join status_updates su on p.user_id = su.user_id
limit 25;
或者,如果您的桌子差异太大,请先使用临时桌子
create table tmp_updates
(
select user_id, p.id as update_id, 'post' as update_type, p.text from posts;
);
insert into table tmp_updates
(
select user_id, su.id as update_id, 'status' as update_type, su.text from status_updates;
);
Select * from tmp_updates
where user_id = '...'
limit 25;
【讨论】: