2011-07-06 26 views
4

我有一个users表和一个歌曲表,我希望选择users表中的所有用户,同时统计他们在歌曲表中有多少首歌。我有这个SQL,但它不起作用,有人可以发现我做错了什么?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

它以什么方式不起作用?它会给出错误还是只是意想不到的结果? – Flimzy

+0

我猜每首歌曲的歌曲数是1。 – Narnian

回答

10

内部连接不起作用,因为它将歌曲表中的每个匹配行与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 
+0

感谢您的帮助,这工作。那么如果我想在WHERE子句中使用song_count,那么因为当我将WHERE song_count> 10时,它不起作用。我如何参考song_count值。非常感谢! – Wasim

+1

使用'HAVING'与一个像COUNT一样的聚合进行比较。 – JNK

+0

您可以将(SELECT COUNT()...)子句添加到WHERE语句中。我会编辑它以表明这一点。你也可以试试“having”子句。 – Narnian

0

尝试

SELECT 
    *, 
    (SELECT COUNT(*) FROM jos_mfs_songs as songs WHERE songs.artist=users.id) as song_count 
FROM 
    jos_mfs_users as users 
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子句中也是如此。

+0

+1对于GROUP BY和删除'*' – JNK

3

变化:

  • 不要做SELECT * ...指定的字段。我包括ID和名称,你可以添加更多的需要的,但把它们放在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 
    
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()是正在分组的行数(在这种情况下是每个用户的结果数)
+0

-1对于单个字段中的'SELECT *'和'GROUP BY' - 如果他的SQL引擎甚至允许它(大多数不会),他将通过'users.id'获得随机记录。 – JNK

+0

这将如何返回随机记录?对于由jos_mfs_users.id分组的每个结果行,来自jos_mfs_users的所有字段将是相同的!并且jos_mfs_songs中的字段不是'SELECT'ed(只有'COUNT()')。我认为你错了! – edam

+0

你是**假设**所有其他领域将是相同的。 OP没有表明这是一个独特的领域或PK。 **选择不在您的“GROUP BY”或聚合中的字段是需要避免的反模式。**期间。 – JNK

0

这看起来像是多对多的关系。我的意思是它看起来好像每个用户的用户表中可以有多个记录,每个用户都有一首歌。 我会有三张桌子。
用户,这对每个用户
的一分歌曲的记录,其中有一个记录为每首歌曲
USER_SONGS,它针对每个用户/歌曲组合
一个记录现在,你可以做的歌曲每个用户的数量通过在中间表上执行查询。你也可以找出有多少用户有特定的歌曲。

这会告诉你每个用户有多少首歌曲

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

这会告诉你每首歌曲有多少用户有

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

我敢肯定你会需要调整这个为你的需求,但它可能会给你你想要的结果类型。

您也可以将这些查询中的任何一个连接到其他两个表以查找用户名和/或艺术家姓名。

HTH
HARV Sather

PS我不知道,如果你正在寻找的歌曲数或艺术家计数。

相关问题