14

我对 2 个不同的表有两个单独的查询,我试图将它们加入一个查询。两个表都在同一个模式中。

我正在尝试形成一个查询,它将返回论坛中最新帖子的论坛 ID、线程 ID 和主题。我可以使用我在下面编写的两个查询,但为了提高效率,我宁愿尽可能只使用一个。

以下是我的查询:

1>
SELECT forumid,threadid
FROM threadtable
WHERE modifieddate = (select max(modifieddate) from threadtable);

2>
SELECT subject
FROM messsagetable
WHERE modifieddate = (select max(modifieddate) from messsagetable);

我尝试了一些解决方案,但似乎在绕圈子。任何建议表示赞赏。版本是 Postgres 8.1。

4

2 回答 2

22
SELECT * FROM 
   (SELECT forumid,threadid
    FROM threadtable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM threadtable)) a, 
   (SELECT subject
    FROM messsagetable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM messsagetable)) b

将第一个结果的所有结果与第二个结果的所有结果结合起来

SELECT * FROM 
   (SELECT forumid,threadid, modifieddate
    FROM threadtable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM threadtable)) a
INNER JOIN 
   (SELECT subject, modifieddate
    FROM messsagetable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM messsagetable)) b
ON a.modifieddate = b.modifieddate

会将第一个的所有结果与第二个具有相同修改日期的所有结果结合起来。

由于两个查询都只返回一个结果行,因此您很可能需要第一个建议。

于 2013-05-20T16:43:38.680 回答
11

要无条件地组合结果,请使用 a CROSS JOIN

SELECT *
FROM  (
    SELECT forumid, threadid
    FROM   threadtable
    ORDER  BY modifieddate DESC
    LIMIT  1
    ) t
CROSS JOIN (
    SELECT subject
    FROM   messsagetable
    ORDER  BY modifieddate DESC
    LIMIT  1
    ) m

我用更快更简单的ORDER BY/修改了基本查询LIMIT 1。如果任一表中有多个行共享最大值modifieddate,则将选择任意一个。
在这种情况下,您可以向ORDER BY子句添加更多项目以选择特定行。

评论后更新

但是,modifieddate 字段在两个表中,并且在我尝试检索的条目的情况下,它将是相同的。

这是一个坏掉的设计。您需要当前版本的 Postgres,并且需要重新考虑您的数据库布局。
就目前而言,上述查询仍然按要求完成工作 - 一旦您直接获得表名。

于 2013-05-20T16:46:47.720 回答