mysql检查值是否在范围内

时间:2018-11-08 16:38:04

标签: mysql range mariadb limit

我有一张mysql(mariadb)图片表,其中包含ID和得分,例如:

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

该表具有更多列,并且可以具有很多寄存器。

我想知道如何将图片标记为“受欢迎”。对于该系统,“受欢迎”是具有更多得分的图片的1%。因此,如果表中有1.000张图片,那么只有10张带有更多点的图片会被标记为“受欢迎”。

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

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,其中包含所有带有有效示例数据的脚本