我有一个用户表和一个歌曲表,我想选择用户表中的所有用户,同时计算他们在歌曲表中有多少首歌曲。我有这个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
非常感谢帮助。谢谢!
答案 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
请注意
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我不确定您是在寻找歌曲数量还是艺术家数量。