2016-11-22 34 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;