我有一个包含多个联接的很大的查询,我还需要进行一个具有相同联接但没有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
正如您在这里看到的那样,我正在为事件制作concat
和string_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个计数。
是否可以仅通过主表进行计数,但仍使用联接中的数据进行过滤/排序?
已更新:我知道我可以将相同的concat
和string_agg
添加到计数查询中,但是此查询应该是轻量级的,因为它将使用{{ 1}}
已更新:我似乎使用limit/offset
distinct
但不确定是最好的方法
答案 0 :(得分:1)
您应该使用半联接:
SELECT count(*) AS count
FROM offer o
WHERE EXISTS (SELECT 1 FROM event e WHERE e.offer_id = o.id);
那将比使用DISTINCT
更快。