Postgres Count IS不运行准确的结果

发布于 2025-01-19 18:58:00 字数 746 浏览 3 评论 0原文

我有此Postgres查询可以通过从多个表查询2列从2列返回计数。

这是一个例子:

SELECT
        subscribers.email,
        COUNT(campaign_views.subscriber_id) AS views,
        COUNT(link_clicks.subscriber_id) AS clicks
        FROM campaign_views, link_clicks, subscribers, links
        WHERE campaign_views.campaign_id = 586
        AND link_clicks.campaign_id = 586
        AND link_clicks.link_id = links.id
        AND subscribers.channel = 'email'
        AND subscribers.id = campaign_views.subscriber_id
        AND subscribers.id = link_clicks.subscriber_id
        GROUP BY subscribers.id

问题是所有这样的人的数量结果是相同的:

views | clicks
16  16
6   6
2   2
4   4

请有什么想法吗?

I have this Postgres query to return a count from 2 columns by querying from multiple tables.

Here is the example:

SELECT
        subscribers.email,
        COUNT(campaign_views.subscriber_id) AS views,
        COUNT(link_clicks.subscriber_id) AS clicks
        FROM campaign_views, link_clicks, subscribers, links
        WHERE campaign_views.campaign_id = 586
        AND link_clicks.campaign_id = 586
        AND link_clicks.link_id = links.id
        AND subscribers.channel = 'email'
        AND subscribers.id = campaign_views.subscriber_id
        AND subscribers.id = link_clicks.subscriber_id
        GROUP BY subscribers.id

The issue is that the COUNT result is the same for all of them like this:

views | clicks
16  16
6   6
2   2
4   4

Any ideas please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笙痞 2025-01-26 18:58:00

FROM campaign_views, link_clicks, subscribers, links

正在创建一个CROSS JOIN

a

value_a
-------
1
2
3

和表 b

value_b
-------
a
b

的示例在

SELECT
    *
FROM a, b

您生成时:

value_a | value_b
--------|--------
      1 | a
      1 | b
      2 | a
      2 | b
      3 | a
      3 | b

当您执行时:

SELECT
    COUNT(a.value_a),
    COUNT(b.value_b)
FROM a,b

您将收到:

count | count
------|------
    6 | 6

COUNT() 返回全部列。在 CROSS JOIN 的结果中,您为所有列生成了 3 * 2 = 6 记录。因此,您得到的所有结果都是相同的,这是有道理的。

With

FROM campaign_views, link_clicks, subscribers, links

you are creating a CROSS JOIN.

Example with table a

value_a
-------
1
2
3

and table b

value_b
-------
a
b

With

SELECT
    *
FROM a, b

you're generating:

value_a | value_b
--------|--------
      1 | a
      1 | b
      2 | a
      2 | b
      3 | a
      3 | b

When you'd execute:

SELECT
    COUNT(a.value_a),
    COUNT(b.value_b)
FROM a,b

you'll receive:

count | count
------|------
    6 | 6

COUNT() returns all columns. In the result of your CROSS JOIN you generated 3 * 2 = 6 records for all columns. So, it makes sense, that all results you get are the same.

许你一世情深 2025-01-26 18:58:00

因此,我设法以准确的结果进行了计数。

WITH camps AS (
SELECT
    subscriber_id,
    COUNT(CASE WHEN subscriber_id = null THEN 0 ELSE 1 END) AS views 
FROM campaign_views
GROUP BY subscriber_id ),

links AS (
SELECT
    subscriber_id,
    COUNT(CASE WHEN subscriber_id = null THEN 0 ELSE 1 END) AS clicks 
FROM link_clicks
GROUP BY subscriber_id )

SELECT 
    subscribers.email, camps.views, links.clicks FROM camps, links, subscribers

WHERE camps.subscriber_id = links.subscriber_id
AND camps.subscriber_id = subscribers.id
AND links.subscriber_id = subscribers.id

So I managed to do the count with the accurate result.

WITH camps AS (
SELECT
    subscriber_id,
    COUNT(CASE WHEN subscriber_id = null THEN 0 ELSE 1 END) AS views 
FROM campaign_views
GROUP BY subscriber_id ),

links AS (
SELECT
    subscriber_id,
    COUNT(CASE WHEN subscriber_id = null THEN 0 ELSE 1 END) AS clicks 
FROM link_clicks
GROUP BY subscriber_id )

SELECT 
    subscribers.email, camps.views, links.clicks FROM camps, links, subscribers

WHERE camps.subscriber_id = links.subscriber_id
AND camps.subscriber_id = subscribers.id
AND links.subscriber_id = subscribers.id
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文