我有一个简单的网络应用程序,当用户点击图像上的收藏夹时,数据库会存储user_id和他们正在查看的image_id,表格如下所示:
Favorites
---------------------
-user_id - image_id -
---------------------
-abc - 123 -
-abc - 456 -
-def - 123 -
---------------------
我正在努力寻找前10名最喜欢的图片(全球),即总体上最受欢迎的10张图片。查询只需要找到最常出现的10个image_id值。到目前为止,我已经尝试了一些基于
的内容SELECT image_id, COUNT(*) FROM favourites GROUP BY image_id LIMIT 100 ORDER DESC
完成此任务的正确查询是什么?
答案 0 :(得分:6)
以下查询应该可以解决问题,它与您的代码几乎相同,但最后一点是不同的:
select
image_id,
count(*)
from
favourites
group by
image_id
order by
count(*) desc
limit 10
您可能还希望阅读Q&A that I wrote,其中涵盖了很多类似的内容。
编辑:
要回答下面的评论之一,在count(*)
语句中使用order by
会导致它再次计算吗?
没有
mysql> select * from test2;
+------+-------+-------+
| id | barry | third |
+------+-------+-------+
| 1 | ccc | NULL |
| NULL | d | 1 |
| NULL | d | 2 |
| NULL | d | 3 |
+------+-------+-------+
4 rows in set (0.00 sec)
mysql> explain select barry, max(third) from test2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | test2 | ALL | NULL | NULL | NULL | NULL | 4 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.11 sec)
mysql> explain select barry, max(third) from test2 order by barry;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | test2 | ALL | NULL | NULL | NULL | NULL | 4 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
mysql> explain select barry, max(third) from test2 order by max(third);
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| 1 | SIMPLE | test2 | ALL | NULL | NULL | NULL | NULL | 4 | Using temporary |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
1 row in set (0.00 sec)
您可以从中看到它将数据存储在temporary
中并从那里使用它。
答案 1 :(得分:0)
试试这个:
SELECT
image_id, count(image_id)
FROM Favorites
GROUP BY image_id
ORDER BY 2 DESC
LIMIT 10