一次从数据库中查询两个表?

时间:2011-05-12 00:53:48

标签: php sql join

我试图一次查询两个表格,以便在“新闻源”中显示成员的活动。

所以,我有两个问题,但我想将它们结合起来:

$status_query = mysql_query("SELECT * FROM member_status_updates WHERE member_id = '1'"):
   and
$topic_query = mysql_query("SELECT * FROM topics WHERE author_id = '1'");

如何组合这两个查询,以便在插入时按顺序显示它们?如果状态是在5秒前发布的,并且昨天发布了一个主题,那么状态更新应该在最顶层。为此,我想我需要将两个查询结合起来。

但我的另一个问题是,如果我按ID DESC排序它会弄乱显示器吗?例如:如果1秒前发布的状态更新的ID为50且昨天发布的主题ID为100,那么主题是否会首先显示,因为ID大于状态更新的ID,即使状态更新是1秒前发布的?如果是这样,那么我想知道如何按日期对它们进行排序,每个记录都有一个时间戳。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

一种解决方案是使用Union All查询:

Select 'member' As Source, <some timestamp col> As InsertedDate, ...
From member_status_updates
Where member_id = 1
Union All
Select 'topics', <some timestamp col>, ...
From topics
Where author_id = '1'
Order By InsertedDate Desc

问题是两个查询的列的列数和数据类型必须相同。 (避免选择*的另一个原因)。


如果您知道总是从topics表中获取一行,并且topics.author_id映射到member_status_updates.member_id,则可以使用左连接。如果您还想要基于某个时间戳值的最后一行,您可以执行以下操作:

Select T.title, M.status_content
From topics As T
    Left Join member_status_updates As M
        On M.member_id = T.author_id
            And M.SomeTimestampCol =    (
                                        Select Max( M1.SomeTimestampCol )
                                        From member_status_updates As M1
                                        Where M1.member_id = 1
                                        )
Where T.author_id = 1
    And T.SomeTimestampCol =    (
                                Select Max( T1.SomeTimestampCol )
                                From topics As T1
                                Where T1.author_id = 1
                                )