Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算Postgresql忽略一对多连接的结果量_Postgresql - Fatal编程技术网

如何计算Postgresql忽略一对多连接的结果量

如何计算Postgresql忽略一对多连接的结果量,postgresql,Postgresql,我有一个非常大的查询,有多个连接,我还需要使用相同的连接进行查询,但是没有limit/offset功能,只是为了获取分页的行总数 我将把这里的查询简化为单连接,并省略所有where子句 我有5个提议,每个提议有2个活动 主查询: SELECT o.id AS "id", o.display_name AS "displayName", o.offer_hidden AS "of

我有一个非常大的查询,有多个连接,我还需要使用相同的连接进行查询,但是没有
limit/offset
功能,只是为了获取分页的行总数

我将把这里的查询简化为单连接,并省略所有where子句

我有5个提议,每个提议有2个活动

主查询:

SELECT o.id                       AS "id",
       o.display_name             AS "displayName",
       o.offer_hidden             AS "offerHidden",
       o.offer_type               AS "offerType",
       array_to_json(o.countries) AS "countries",
       string_agg(distinct concat(COALESCE(e.event_id::text, ''), ',, ', COALESCE(e.event_tag::text, ''), ',, ',
                                  COALESCE(e.payout::text, '')), ';;') AS "events"
FROM offer o
                  INNER JOIN (SELECT e.event_id, e.event_tag, e.payout, e.offer_id FROM event e ORDER BY e.offer_id ASC) e
                                                                     ON e.offer_id = o.id
GROUP BY o.id
SELECT count(1) AS count
FROM offer o
         INNER JOIN (SELECT e.event_id, e.event_tag, e.payout, e.offer_id FROM event e ORDER BY e.offer_id ASC) e
                    ON e.offer_id = o.id
正如您在这里看到的,我正在为活动制作
concat
string\u add
,以获得每个报价的单个记录

计数查询:

SELECT o.id                       AS "id",
       o.display_name             AS "displayName",
       o.offer_hidden             AS "offerHidden",
       o.offer_type               AS "offerType",
       array_to_json(o.countries) AS "countries",
       string_agg(distinct concat(COALESCE(e.event_id::text, ''), ',, ', COALESCE(e.event_tag::text, ''), ',, ',
                                  COALESCE(e.payout::text, '')), ';;') AS "events"
FROM offer o
                  INNER JOIN (SELECT e.event_id, e.event_tag, e.payout, e.offer_id FROM event e ORDER BY e.offer_id ASC) e
                                                                     ON e.offer_id = o.id
GROUP BY o.id
SELECT count(1) AS count
FROM offer o
         INNER JOIN (SELECT e.event_id, e.event_tag, e.payout, e.offer_id FROM event e ORDER BY e.offer_id ASC) e
                    ON e.offer_id = o.id
在这里,我试图使查询尽可能轻量级,忽略所有选择并使用唯一计数,但我得到计数10,因为每个提供有2个事件(5*2=10)

问题:是否可以仅按主表进行计数,但仍使用联接中的数据进行筛选/排序

更新:我知道我可以将相同的
concat
string\u agg
添加到计数查询中,但此查询应该是轻量级的,因为它将查询具有
限制/偏移量的所有记录

更新:看来我找到了一个可能的解决方案,使用了
distinct

SELECT count(distinct o.id) AS count
FROM offer o
         INNER JOIN (SELECT e.event_id, e.event_tag, e.payout, e.offer_id FROM event e ORDER BY e.offer_id ASC) e
                    ON e.offer_id = o.id

但不确定这样做的最佳方式是什么

您应该使用半连接:

SELECT count(*) AS count
FROM offer o
WHERE EXISTS (SELECT 1 FROM event e WHERE e.offer_id = o.id);
这将比使用
DISTINCT
更快