2016-11-22 28 views
2

我有一個存儲用戶項目的表格,我想在此查詢中使用這兩個鍵的字段USER_IDITEM_ID。示例中的id字段不是必需的,只是添加以顯示這些不是表中唯一的兩列。爲了通過列數其中另一列有一個靜態值

 
---------------------- 
id user_id item_id 
---------------------- 
1  1  324 
2  1  324 
3  3  324 
4  2  230 
5  4  324 

我想構建的查詢應返回具有特定項目ID的項目最多的前10位用戶。

因此,例如,如果我想對物品ID 324運行查詢,我應該得到以下結果。

 
------------------- 
user_id item_count 
------------------- 
1   2 
3   1 
4   1 
2   0 
+0

你應該使用組(?但爲什麼user_2 ITEM_COUNT = 0 ...應該是1太) – scaisEdge

+0

和'COUNT()'函數 –

+0

你真的想第4行具有零計數? –

回答

1

試試這個

select user_id , count(*) as item_count from table 
where item_id = 324 group by user_id order by item_count desc limit 10 

上限10將顯示排名前10位用戶和按順序排列從高到低。

但是,上述查詢不會按照您的問題給出0計數。如果你真的想零計數你可以試試這個:(假設你的表名是用戶列表)

SELECT distinct user_id, 
(select 
    count(*) from `userlist` 
    where user_id=u.user_id and item_id=324 
) as item_count FROM `userlist` u 
order by item_count desc 
0

我不能在我的本地創建數據庫,但我認爲這會做的伎倆

SELECT user_id, COUNT(item_id) as item_count 
FROM TABLE_NAME 
WHERE item_id = 324 
GROUP BY item_id 
ORDER BY item_count; 
0

這裏是微不足道的解決方案。它會返回三行,這將不包括行,其中計數爲0:

SELECT user_id, COUNT(*) AS c 
FROM user_item 
WHERE item_id = 324 
GROUP BY user_id 
ORDER BY c DESC 
LIMIT 10 
+---------+---+ 
| user_id | c | 
+---------+---+ 
|  1 | 2 | 
|  4 | 1 | 
|  3 | 1 | 
+---------+---+ 

如果你想零個計數以及隨後至少有兩種可能的解決方案。第一個是您移動where子句來算功能:

SELECT user_id, COUNT(CASE WHEN item_id = 324 THEN 1 END) AS c 
FROM user_item 
GROUP BY user_id 
ORDER BY c DESC 
LIMIT 10 
+---------+---+ 
| user_id | c | 
+---------+---+ 
|  1 | 2 | 
|  4 | 1 | 
|  3 | 1 | 
|  2 | 0 | 
+---------+---+ 

第二個採用左連接,使表中的所有用戶都包括在內,以及零數,並可能給你表現稍好:

SELECT user_item.user_id, COUNT(foo.item_id) AS c 
FROM user_item 
LEFT JOIN (SELECT 324 AS item_id) AS foo ON user_item.item_id = foo.item_id 
GROUP BY user_item.user_id 
ORDER BY c DESC 
LIMIT 10; 
相關問題