2010-03-30 53 views
2

我正在研究一種小型的日誌系統到網頁,並且我在查詢時遇到了一些困難,我想做很多事情。我試圖做一些嵌套/子查詢,但似乎無法做到正確。SQL查詢幫助(列表字符串和計數在相同的查詢中)

我有兩個表:

User = {userid: int, username} 

Registered = {userid: int, favoriteid: int} 

我需要的是一個查詢,列出所有的用戶ID的每個用戶的用戶名。另外,我還需要計算用戶註冊的favoriteid的總數。

未註冊任何收藏夾的用戶也必須列出,但最喜歡的計數顯示爲零。

我希望我已經解釋了我的要求,否則請回復,以便我可以詳細說明。

順便說一句,我已經嘗試一下這樣的查詢:

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

但是,它不會做的伎倆,可惜

親切的問候 Mestika

回答

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

將'ISNULL'換成'COALESCE',並且您有一個可以在Oracle,SQL Server,MySQL,Postgres上運行的查詢... :) – 2010-03-30 05:04:08

+0

良好的調用。我已經在測試數據庫中測試了我的陳述,以確保我沒有把任何人引向錯誤的方向。 – 2010-03-30 05:05:10

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 
+0

非常感謝托馬斯它像一個魅力和一個非常快速的答案。再次感謝:-) – Mestika 2010-03-30 05:20:32

0

SELECT user.userid,user.username,計數(favoriteid) FROM用戶,註冊 WHERE user.userid = registered.userid gorupby用戶。用戶ID,user.username UNION SELECT user.userid,user.username,0 FROM用戶 WHERE user.userid NOT EXISITS(選擇1從登記其中registered.userid = user.userid)