我在两个不同的表上有两个单独的查询,我试图加入一个查询。两个表都在同一模式中。
我正在尝试形成一个查询,它将在论坛中返回最新帖子的forumid,threadid和主题。我可以使用下面写的两个查询,但为了提高效率,我宁愿在可能的情况下只使用一个。
以下是我的疑问:
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。
答案 0 :(得分:10)
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
将第一个结果与第二个具有相同修订日期的结果结合起来。
由于两个查询只返回一个结果,你很可能想要第一个建议。
答案 1 :(得分:8)
要无条件地合并结果,请使用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
子句中添加更多项目以在这种情况下选择某一行。
然而,修改日期字段在两个表中,在情况下 我试图检索它的条目将是相同的。
这是一个破碎的设计。您需要当前版本的Postgres,您需要重新考虑数据库布局 至于现在,上面的查询仍然按照要求完成了工作 - 一旦你的表名直接。