我有一个 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
...这让我很接近,但没有产生我需要的确切结果——它给了我不同计数的多行结果。在这种情况下,我可以使用任何魔法并将其保存在单个查询中吗?当然,在保持尽可能高效的同时 :) 谢谢!
最佳答案
如果我答对了你的问题,那么你的 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
关于mysql - 统计多外键表的记录(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008941/