2011-07-29 22 views
1

所以我有一個「書籤」表,爲此我試圖獲取擁有最多內容書籤的用戶的「UserID」。該查詢返回十個最活躍用戶的UserID。這個查詢看起來是這樣的,我和工作原理:如何在爲最多行進行計數時加入SQL表?

SELECT COUNT(*) AS `Rows`, UserID FROM `bookmark` 
WHERE UserID NOT IN(1, 2, 25, 38, 41, 43, 47, 125) 
GROUP BY UserID ORDER BY `Rows` DESC LIMIT 10 

我現在想加入結果查詢到「帳戶」表的用戶ID進行比較的「ID」來獲得每個用戶ID的所有信息在帳戶表中。

SELECT COUNT(*) AS `Rows`, UserID FROM `bookmark` 
join accounts ON accounts.ID = bookmark.UserID 
WHERE UserID NOT IN(1, 2, 25, 38, 41, 43, 47, 125) 
GROUP BY UserID ORDER BY `Rows` DESC LIMIT 10 

這不返回任何行的賬目表,但因爲之前,而不是返回相同的結果。我需要能夠獲得帳戶表中的所有行(與使用*相同的東西)

如果它有助於我的帳戶表具有這些行= user_name,id,電子郵件和我的書籤表具有這些行= id, UserId,鏈接

+0

您沒有從\ accounts \'表中選擇任何內容。將第一行更改爲SELECT COUNT(*)AS \'Rows \',UserID FROM \'bookmark \',* FROM \'accounts \' –

+0

您沒有在您的選擇列表中包含來自其他表的任何列。 – Randy

+0

我 - 我辯論過 - 但這幾乎肯定是解決方案。 OP可以確定要顯示的列。 – Randy

回答

1

一種解決方案是將group by移動到一個子查詢:

select * 
from (
     select count(*) as Rows 
     ,  UserID 
     from bookmark 
     where UserID not in (1, 2, 25, 38, 41, 43, 47, 125) 
     group by 
       UserID 
     ) as BookmarkSubquery 
join accounts 
on  accounts.ID = BookmarkSubquery.UserID 
order by 
     BookmarkSubquery.Rows DESC 
limit 10 

另一種是從賬戶通過添加列組:

select count(*) as Rows 
,  bookmark.UserID 
,  accounts.Name 
,  accounts.BirthDate 
from bookmark 
join accounts 
on  accounts.ID = BookmarkSubquery.UserID 
where bookmark.UserID not in (1, 2, 25, 38, 41, 43, 47, 125) 
group by 
,  bookmark.UserID 
,  accounts.Name 
,  accounts.BirthDate 
order by 
     count(*) DESC 
limit 10 

注:MySQL允許你只列出bookmark.UserIDgroup by;雖然這會起作用,但並不推薦。

0

這可能很難看,但您可以將第一個查詢存儲在臨時表中,然後在帳戶和臨時表之間進行連接。

此外,嘗試做一個左連接,看看你是否得到任何方式。有時這有助於調試查詢。