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

时间:2010-01-05 20:41:04

标签: mysql

我有一个包含各种表的MySQL数据库,其记录可以被标记,因此我有一个tags表和一个tag_associations表,它通过多个外键将标记与其他“可标记”表相关联,还有一个“拥有”的用户 - 我的字段类似于以下内容:

  • tag_association_id(主键)
  • user_id(标记关联创建者)
  • tag_id(相关标签)
  • artist_id(标记为艺术家,可以为null)
  • album_id(已标记的相册,可以为null)
  • track_id(已标记的曲目,可以为null)

我基本上想要计算所有标记了特定标记的项目 - 所以这个查询的结果是这样的:

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'

但是这个查询的问题在于多个用户将相同的标签应用于同一个项目的情况,因此如果2个不同的用户将艺术家的'Bobby Jones Band'标记为'rad',则它同时计算标记关联,我只想计算一次。我尝试将其添加到上面:

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

...让我接近,但没有得到我需要的确切结果 - 它给了我不同计数的多行结果。在这种情况下我是否可以使用任何魔法并将其保存在单个查询中?虽然保持尽可能高效,当然:)谢谢!

1 个答案:

答案 0 :(得分:1)

如果我的问题是正确的,那么GROUP BY几乎应该完成这项工作。

此解决方案应获取tag_associations中的唯一行并计算它们。

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