我正在为一个网页开发一种小型的日志系统,而我在查询时遇到一些困难,我想做多件事。我试图做一些嵌套/子查询,但似乎无法做到正确。
我有两张桌子:
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
答案 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)