mysql 检查值是否在范围内

mysql check if a value is in a range or not

我有一张 mysql (mariadb) table 的图片,其中包含它们的 id 和分数,如下所示:

TABLE Pics
-----------
id   points
-----------
1    500
2    10
3    150
4    70
...

table列较多,可以有很多寄存器。

我想知道如何知道一张图片是否可以被标记为 "popular"。对于系统,"popular" 将是 1% 的图片具有更多点。所以,如果我在 table 中有 1.000 张图片,那么只有 10 张点数更多的图片会被标记为 "popular"。

那么,查询如何知道给定 id 的图片是否受欢迎?

非常感谢!

您可以在按分数排序后使用 LIMIT 子句仅 select 10 张最受欢迎的照片,或者如果您需要 select 所有照片,您可以使用类似于以下查询的变量:

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 @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;

请记住,最好将子查询生成的数据量限制在最低限度,以便在数据库变大时查询保持良好的性能。

Here's 一个 DB-Fiddle 以及所有那些具有工作样本数据的脚本