SQL用于从一个表中收集数据,同时计算另一个表中的记录

时间:2011-07-06 15:30:32

标签: sql count

我有一个用户表和一个歌曲表,我想选择用户表中的所有用户,同时计算他们在歌曲表中有多少首歌曲。我有这个SQL,但它不起作用,有人能发现我做错了吗?

SELECT jos_mfs_users.*, COUNT(jos_mfs_songs.id) as song_count 
FROM jos_mfs_users 
INNER JOIN jos_mfs_songs
ON jos_mfs_songs.artist=jos_mfs_users.id

非常感谢帮助。谢谢!

6 个答案:

答案 0 :(得分:11)

内部联接不起作用,因为它将songs表中的每个匹配行与users表连接。

SELECT jos_mfs_users.*, 
    (SELECT COUNT(jos_mfs_songs.id) 
        FROM jos_mfs_songs
        WHERE jos_mfs_songs.artist=jos_mfs_users.id) as song_count 
FROM jos_mfs_users 
WHERE (SELECT COUNT(jos_mfs_songs.id) 
        FROM jos_mfs_songs
        WHERE jos_mfs_songs.artist=jos_mfs_users.id) > 10

答案 1 :(得分:3)

缺少GROUP BY条款,例如

SELECT jos_mfs_users.id, COUNT(jos_mfs_songs.id) as song_count 
FROM jos_mfs_users 
INNER JOIN jos_mfs_songs
ON jos_mfs_songs.artist=jos_mfs_users.id
GROUP BY jos_mfs_users.id

如果您想在选择列表中添加jos_mfs_users中的更多列,您也应该在GROUP BY子句中添加它们。

答案 2 :(得分:3)

的变化:

  • 不要SELECT * ...指定您的字段。我添加了ID和NAME,您可以根据需要添加更多内容,但也可以将它们放在GROUP BY

  • 更改为LEFT JOIN - INNER JOIN不会列出任何没有歌曲的用户

  • 添加了GROUP BY,因此它提供了有效的计数并且是有效的语法

    SELECT u.id, u.name COUNT(s.id) as song_count 
    FROM jos_mfs_users AS u
    LEFT JOIN jos_mfs_songs AS S
        ON s.artist = u.id
    GROUP BY U.id, u.name
    

答案 3 :(得分:0)

尝试

SELECT 
  *, 
  (SELECT COUNT(*) FROM jos_mfs_songs as songs WHERE songs.artist=users.id) as song_count 
FROM 
  jos_mfs_users as users

答案 4 :(得分:0)

您需要GROUP BY子句来使用聚合函数(例如COUNT()

因此,假设jos_mfs_users.id是主键,这样的东西将起作用:

SELECT jos_mfs_users.*, COUNT( jos_mfs_users.id ) as song_count 
FROM jos_mfs_users 
INNER JOIN jos_mfs_songs
  ON jos_mfs_songs.artist = jos_mfs_users.id
GROUP BY jos_mfs_users.id

请注意

  • 由于您按用户ID进行分组,因此您将在结果
  • 中为每个不同的用户ID获得一个结果
  • COUNT()所需要的是被分组的行数(在这种情况下是每个用户的结果数)

答案 5 :(得分:0)

这似乎是一对多关系。我的意思是,看起来每个用户的用户表中都有几条记录,每首歌都有一首。 我会有三张桌子 用户,每个用户有一条记录 歌曲,每首歌曲有一个记录 USER_SONGS,每个用户/歌曲组合有一条记录
现在,您可以通过在中间表上执行查询来计算每个用户拥有的歌曲。您还可以找出有多少用户拥有特定歌曲。

这将告诉您每位用户有多少首歌

select id, count(*) from USER_SONGS
GROUP BY id;

这将告诉您每首歌有多少用户

select artist, count(*) from USER_SONGS
GROUP BY artist;

我确信您需要根据自己的需要调整此项,但它可能会为您提供所需的结果类型。

您也可以将其中任何一个查询加入其他两个表中,以查找用户名和/或艺术家名称。

HTH
哈夫萨瑟

ps我不确定您是在寻找歌曲数量还是艺术家数量。