【问题标题】:Querying two tables from the database at once?一次从数据库中查询两个表?
【发布时间】:2011-05-12 00:53:47
【问题描述】:

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

所以,我有两个查询,但我想将它们合并:

$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 秒前?如果是这样,那么我想知道如何按日期对它们进行排序,每条记录都有一个时间戳。

非常感谢任何帮助。

【问题讨论】:

  • 应该返回哪些列以及每个表中的哪些列代表您要过滤插入时间的时间?
  • topics.author_id 和 memberstatus_status_updates.member_id 代表相同的东西吗?
  • 应该为更新的“status_content”和主题的“title”返回的列。另外 - 是的,它将显示相同的用户 ID(@第二条评论)。
  • 是应该始终从主题表中获取一行还是应该始终从 members_status_updates 表中获取一行,或者可能为空?

标签: php sql join


【解决方案1】:

一种解决方案是使用 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
                                )

【讨论】:

  • 正如所写,此解决方案未考虑@Dan 的订单要求。
  • 谢谢,我得到了运行查询。但我对如何实际显示结果感到困惑。我正在使用 while(),但它似乎没有显示数据库中的任何信息。我运行查询时的完整数组是这样的: Array ( [0] => status_member_id [Source] => status_member_id [1] => status_date [InsertedDate] => status_date )
  • @Dan - 当您直接对数据库运行查询(而不是通过您的界面)时,您会得到什么结果?如果您运行其中一个 Select 语句而不是另一个,该怎么办? Union All 实际上是将两个查询结果堆叠在一起,因此如果您没有得到任何结果,那么两个单独的查询都不会返回任何结果。
  • @Thomas,对不起,我应该指定。它实际上返回 590 个条目。我在 while() 循环中有文本内幕,它显示了 590 次,但没有显示来自数据库的数据。
  • @Dan - 我添加了另一个变体。但是,您是应该始终从主题中获取一行还是始终从 member_status_updates 中获取一行?这将影响联接的性质。
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
相关资源
最近更新 更多