帮助SQL查询(列出字符串并在同一查询中计数)

时间:2010-03-30 04:55:03

标签: sql nested subquery

我正在为一个网页开发一种小型的日志系统,而我在查询时遇到一些困难,我想做多件事。我试图做一些嵌套/子查询,但似乎无法做到正确。

我有两张桌子:

User = {userid: int, username}

Registered =  {userid: int, favoriteid: int}

我需要的是一个查询列出所有用户ID和每个用户的用户名。另外,我还需要计算用户注册的favid的总数。

还必须列出未注册任何收藏的用户,但收藏计数显示为零。

我希望我已经解释了我的要求,但请另外回复,以便我详细说明。

顺便说一下,我试过的查询看起来像这样:

SELECT user.userid, user.username FROM user,registered WHERE user.userid = registered.userid(SELECT COUNT(favoriteid) FROM registered)

然而,不幸的是,它不能解决问题

亲切的问候 Mestika

3 个答案:

答案 0 :(得分:1)

尝试这样的事情(未经测试)

Select u.userid, username, ISNULL(x.FavoriteCount, 0) as FavoriteCount
From User u 
Left Join
(Select userid, count(*) as FavoriteCount
From Registered
Group By userid) x
on u.userid = x.userid

顺便说一句,这是SQL Server语法。 MySql语法非常相似,只需用IFNULL替换ISNULL函数。如果这是另一个DBMS,那么它至少应该给你一个想法。

编辑:根据OMG Ponies,可以使用COALESCE代替ISNULL使其在SQL Server / MySQL / Oracle / etc中运行。我在SQL Server上验证了这一点。

有关空函数的更多信息,请参见此处:http://www.w3schools.com/SQL/sql_isnull.asp

答案 1 :(得分:0)

Select userid, username
    , ( Select Count(*) From Registered As R Where R.userid = U.userid ) As RegistrationCount
From User As U

如果favoriteId可以为空,那么使用

Select userid, username
    , ( Select Count(favoriteid) From Registered As R Where R.userid = U.userid ) As RegistrationCount
From User As U

答案 2 :(得分:0)

SELECT user.userid,user.username,count(favoriteid) 来自用户,已注册 WHERE user.userid = registered.userid gorupby user.userid,user.username 联盟 SELECT user.userid,user.username,0 来自用户 WHERE user.userid NOT EXISITS(从注册中选择1,其中registered.userid = user.userid)