【问题标题】:Counting records of a table with multiple foreign keys (MySQL)计算具有多个外键的表的记录(MySQL)
【发布时间】:2010-01-06 16:12:27
【问题描述】:

我有一个 MySQL 数据库,其中包含可以标记记录的各种表,因此我有一个 tags 表和一个 tag_associations 表,它通过多个外键将标签与其他“可标记”表相关联,也与“拥有”用户——我的字段如下所示:

  • tag_association_id(主键)
  • user_id(标签关联创建者)
  • tag_id(相关标签)
  • artist_id(标记的艺术家,可以为空)
  • album_id(带标签的专辑,可以为空)
  • track_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'

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

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

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

【问题讨论】:

    标签: mysql


    【解决方案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
    

    【讨论】:

    • 感谢彼得的回复!当我运行它时,我得到一个错误:“每个派生表都必须有自己的别名”。在我看来,子查询的结果正在 FROM 中使用,因此作为在外部查询中查询的表 - 对吗?在这种情况下,结果不会出现是有道理的......
    • 对不起。我添加了别名(x),请重试。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2014-05-14
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多