我有一个mysql(mariadb)图片表,上面有图片的id和分数,如下所示:
TABLE Pics-----------id points-----------1 5002 103 1504 70...
TABLE Pics
-----------
id points
1 500
2 10
3 150
4 70
...
表有更多的列,可以有很多寄存器。我想知道如何知道一张图片是否可以被标记为“流行”。对于系统,“流行”将是1%的图片与更多的分数。所以,如果我有1000张图片在表中,只有10张图片与更多的点将被标记为“流行”。那么,查询如何知道给定id的图片是否流行呢?非常感谢!
pdsfdshx1#
你可以使用 LIMIT 子句按分数排序后,仅选择10张最流行的照片,或者如果需要选择所有照片,则可以使用如下查询中的变量:
LIMIT
SET @rank = 0;SELECT IF((@rank := @rank + 1) <= 10, "popular", "unpopular"), p.* FROM picture_table AS p ORDER BY p.score DESC;
SET @rank = 0;
SELECT IF((@rank := @rank + 1) <= 10, "popular", "unpopular"), p.*
FROM picture_table AS p
ORDER BY p.score DESC;
如果需要动态限制,可以执行第一个查询来计算元素总数,并在该查询中使用它,如下所示:
SET @rank = 0;SET @limit = 10/100; -- 10%SELECT (@limit := ROUND(COUNT(ID) * @limit)) FROM picture_table;SELECT IF((@rank := @rank + 1) <= @limit, "popular", "unpopular"), p.* FROM picture_table AS p ORDER BY p.score DESC;
SET @limit = 10/100; -- 10%
SELECT (@limit := ROUND(COUNT(ID) * @limit)) FROM picture_table;
SELECT IF((@rank := @rank + 1) <= @limit, "popular", "unpopular"), p.*
现在,通过该查询,您可以使用子查询来确定特定图片是否受欢迎:
SET @rank = 0;SET @limit = 10/100;SELECT (@limit := ROUND(COUNT(ID) * @limit)) FROM picture_table;SELECT Q1.popularity, p.* FROM picture_table AS p INNER JOIN (SELECT IF((@rank := @rank + 1) <= @limit, "popular", "unpopular") AS 'popularity', p.ID FROM picture_table AS p ORDER BY p.score DESC) AS Q1 ON Q1.ID = p.ID WHERE p.ID = 16;
SET @limit = 10/100;
SELECT Q1.popularity, p.*
INNER JOIN (SELECT IF((@rank := @rank + 1) <= @limit, "popular", "unpopular") AS 'popularity', p.ID
ORDER BY p.score DESC) AS Q1 ON Q1.ID = p.ID
WHERE p.ID = 16;
请记住,最好将子查询生成的数据量限制在最低限度,以便在数据库变大时查询保持良好的性能。这里有一个数据库,它处理所有这些脚本和工作样本数据
1条答案
按热度按时间pdsfdshx1#
你可以使用
LIMIT
子句按分数排序后,仅选择10张最流行的照片,或者如果需要选择所有照片,则可以使用如下查询中的变量:如果需要动态限制,可以执行第一个查询来计算元素总数,并在该查询中使用它,如下所示:
现在,通过该查询,您可以使用子查询来确定特定图片是否受欢迎:
请记住,最好将子查询生成的数据量限制在最低限度,以便在数据库变大时查询保持良好的性能。
这里有一个数据库,它处理所有这些脚本和工作样本数据