统计具有多个外键的表的记录(MySQL)

统计具有多个外键的表的记录(MySQL),mysql,Mysql,我有一个MySQL数据库,其中有各种可以标记记录的表,所以我有一个tags表,还有一个tag\u associations表,它通过多个外键将标记与其他“可标记”表以及“拥有”用户关联——我的字段如下所示: 标记关联id(主键) 用户id(标签关联创建者) 标签id(相关标签) 艺术家id(带标签的艺术家,可以为空) 唱片集\u id(带标签的唱片集,可以为空) 轨迹id(带标记的轨迹,可以为空) 我基本上想计算所有被标记为特定标记的项目——因此,在这个查询的结果中: SELECT

我有一个MySQL数据库,其中有各种可以标记记录的表,所以我有一个
tags
表,还有一个
tag\u associations
表,它通过多个外键将标记与其他“可标记”表以及“拥有”用户关联——我的字段如下所示:

  • 标记关联id(主键)
  • 用户id(标签关联创建者)
  • 标签id(相关标签)
  • 艺术家id(带标签的艺术家,可以为空)
  • 唱片集\u id(带标签的唱片集,可以为空)
  • 轨迹id(带标记的轨迹,可以为空)
我基本上想计算所有被标记为特定标记的项目——因此,在这个查询的结果中:

SELECT
    COUNT(ta.tag_association_id) AS how_many
FROM
    tag_associations AS ta
    LEFT JOIN users AS u ON ta.user_id = u.user_id
WHERE
    ta.tag_id = '480'
    AND u.user_status = 'active'
但是这个查询的问题在于,同一个标记被多个用户应用于同一个项目的情况下,因此如果两个不同的用户将艺术家“Bobby Jones Band”标记为“rad”,它将计算两个标记关联,我只想计算一次。我尝试将此添加到上面:

GROUP BY ta.artist_id, ta.album_id, ta.track_id

…这让我很接近,但没有得到我需要的准确结果--它给了我不同计数的多行结果。在这样的情况下,有没有什么魔法可以用在一个查询中?当然,在尽可能保持效率的同时:)谢谢

如果我答对了你的问题,那么你的
分组应该差不多可以完成这项工作了

此解决方案应从
标记关联中获取唯一行
,并对其进行计数

SELECT COUNT(*)
FROM
(
    SELECT 1
    FROM tag_associations AS ta 
    LEFT JOIN users AS u ON ta.user_id = u.user_id
    WHERE ta.tag_id = '480' 
    AND u.user_status = 'active' 
    GROUP BY ta.artist_id, ta.album_id, ta.track_id
) x

如果我答对了你的问题,那么你的
分组应该差不多可以完成这项工作了

此解决方案应从
标记关联中获取唯一行
,并对其进行计数

SELECT COUNT(*)
FROM
(
    SELECT 1
    FROM tag_associations AS ta 
    LEFT JOIN users AS u ON ta.user_id = u.user_id
    WHERE ta.tag_id = '480' 
    AND u.user_status = 'active' 
    GROUP BY ta.artist_id, ta.album_id, ta.track_id
) x

谢谢你的回复,彼得!当我运行此命令时,我得到一个错误:“每个派生表都必须有自己的别名”。在我看来,子查询的结果在FROM中使用,因此在外部查询中用作查询的表,对吗?在这种情况下,结果不会出来是有道理的……对不起。我添加了别名(
x
),请重试。感谢您的回复!当我运行此命令时,我得到一个错误:“每个派生表都必须有自己的别名”。在我看来,子查询的结果在FROM中使用,因此在外部查询中用作查询的表,对吗?在这种情况下,结果不会出来是有道理的……对不起。我添加了别名(
x
),请重试。