我正在使用postgres 9.4,我想将2个单独的查询合并为一个语句。我一直在看这篇How to merge these queries into 1 using subquery帖子,但仍然无法弄清楚如何使用它。这两个查询可以独立工作。他们在这里
# 1: select * from votes v where v.user_id=32 and v.stream_id=130;
#2: select city,state,post,created_on,votes,id as Voted from streams
where latitudes >=28.0363 AND 28.9059>= latitudes order by votes desc limit 5 ;
我希望查询#2受限于5,但是我不希望查询#1包含在该限制中,因此总共最多可以返回6行。这就像一个建议引擎,其中查询#1有一个主线程,查询#2提供了多达5个不同的建议,但它们显然位于不同的表中。
答案 0 :(得分:1)
没有模型和数据我在SQL Fiddle中使用两者的假人模拟了这个问题。
CREATE TABLE votes
(
id smallint
, user_id smallint
);
CREATE TABLE streams
(
id smallint
, foo boolean
);
INSERT INTO votes
VALUES (1, 42), (2, 32), (3, 17), (4, 37), (5, 73), (6, 69), (7, 21), (8, 18), (9, 11), (10, 15), (11, 28);
INSERT INTO streams
VALUES (1, true), (2, true), (3, true), (4, true), (5, true), (6, true), (7, false), (8, false), (9, false), (10, false), (11, false);
SELECT
id
FROM
(SELECT id, 1 AS sort FROM votes WHERE user_id = 32) AS query_1
FULL JOIN (SELECT id FROM streams WHERE NOT foo) AS query_2 USING (id)
ORDER BY
sort
LIMIT 6;
另外我必须指出,这不完全是我的工作,但是前几天我遇到了answer的改编。也许这也是一种方法。
那么,发生了什么?列id
代表您的表和子查询共有的任何列。 votes.user_id
我做了某事。在一个子查询中选择,在另一个子查询中选择streams.foo
。
由于你要求最多有6行我使用了限制条款两次。首先在子查询中,以防万一表中存在大量行,您不希望再次选择外部查询以最终限制行数。在两个限制上略微调整一下,然后切换WHERE foo
和WHERE NOT foo
,你会明白为什么。
在第一个子查询中,我添加了一个排序列,就像在该答案中完成一样。那是因为我猜你想要第一个子查询的结果总是在顶部。