如何在Postgresql中计算结果数量而忽略一对多联接

时间:2019-06-14 10:00:32

标签: postgresql

我有一个包含多个联接的很大的查询,我还需要进行一个具有相同联接但没有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

正如您在这里看到的那样,我正在为事件制作concatstring_add,以便为每个要约获得一条记录

计数查询:

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

在这里,我试图使查询尽可能轻巧,从而省略所有选择并使用唯一计数,但由于每个要约具有2个事件(5 * 2 = 10),我得到了10个计数。

是否可以仅通过主表进行计数,但仍使用联接中的数据进行过滤/排序?

已更新:我知道我可以将相同的concatstring_agg添加到计数查询中,但是此查询应该是轻量级的,因为它将使用{{ 1}}

已更新:我似乎使用limit/offset

找到了可能的解决方案
distinct

但不确定是最好的方法

1 个答案:

答案 0 :(得分:1)

您应该使用半联接:

SELECT count(*) AS count
FROM offer o
WHERE EXISTS (SELECT 1 FROM event e WHERE e.offer_id = o.id);

那将比使用DISTINCT更快。