sql - 从多个连接表中获取匹配行数

Posted

技术标签:

【中文标题】sql - 从多个连接表中获取匹配行数【英文标题】:sql - Get count of matching rows from multiple joined tables 【发布时间】:2014-10-24 12:07:08 【问题描述】:

我正在尝试获取属于我的“广告”表(也属于用户)中各个行的点击次数和查看次数。我还尝试按观看次数最多的广告对结果进行排序。

我的表格结构:

用户:

id name
1  James

ads:属于用户(FK:user_id)

id user_id
22 1
23 4

views:属于广告(FK:ad_id)

id ad_id
1  22
2  22
3  23

点击次数:属于广告(FK:ad_id)

id ad_id
1  22
2  22
3  23

从上面的表格中,我想要一个结果,其中包含属于 id = 1 的用户的所有广告的数据以及每个广告的点击次数和查看次数

id user_id clicks_count views_count
22 1       2            2

这是我目前所拥有的。使用此 SQL,我仅获得一个/第一个“广告”行的正确查看次数和点击次数,但忽略其他匹配行。

SELECT ads.id, COUNT(DISTINCT views.id) AS view_count, COUNT(DISTINCT clicks.id) AS click_count   
FROM users
INNER JOIN ads ON ads.`user_id` = users.`id`
INNER JOIN views ON ads.id = views.`ad_id`
INNER JOIN clicks ON ads.id = clicks.`ad_id`
WHERE users.`id` = 1
GROUP BY views.`ad_id`
ORDER BY `view_count` DESC

这是一个 sqlfiddle http://sqlfiddle.com/#!2/5c43c/1/0

提前致谢

【问题讨论】:

您的查询使用您指定的数据产生您想要的结果:sqlfiddle.com/#!2/7ef65。 (您原来的 SQL Fiddle 的 clicks 数据错误。 可以,但是当我在“广告”表中插入新行(没有点击或查看)时,它不会与其他广告一起返回。 【参考方案1】:

您需要使用LEFT OUTER JOIN 以免丢失没有点击的广告

SELECT ads.id, COUNT(DISTINCT views.id) AS view_count, COUNT(DISTINCT clicks.id) AS click_count   
    FROM users
    INNER JOIN ads ON ads.`user_id` = users.`id`
    LEFT JOIN views ON ads.id = views.`ad_id`
    LEFT JOIN clicks ON ads.id = clicks.`ad_id`
    WHERE users.`id` = 1
    GROUP BY ads.`id`
    ORDER BY `view_count` DESC

【讨论】:

当我将“GROUP BY ads.ad_id”更改为“GROUP BY ads.id”时,这有效。谢谢【参考方案2】:
SELECT ads.id,ads.user_id, COUNT(DISTINCT views.id) AS view_count, 
COUNT(DISTINCT clicks.id) AS click_count   
    FROM users
    inner JOIN ads ON ads.`user_id` = users.`id`
    LEFT JOIN views ON ads.id = views.`ad_id`
    LEFT JOIN clicks ON ads.id = clicks.`ad_id`
    WHERE users.`id` = 1
    GROUP BY views.`ad_id`
    ORDER BY `view_count` DESC

INNER 是正确的,但你应该使用两个左连接

【讨论】:

以上是关于sql - 从多个连接表中获取匹配行数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个连接的 SQL 查询并使用休眠计数

SQL连接(join)

14连接的使用

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?

连接两个表并从一列返回多个匹配项的 SQL 查询?

如何从SQL表中选择特定行并在SQL Server中连接多个表?