mysql проверяет, находится ли значение в диапазоне или нет - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица картинок mysql (mariadb) с идентификатором и счетом, например:

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

Таблица содержит больше столбцов и может содержать много регистров.

Я хочу знать, как узнать, можно ли пометить изображение как «популярное». Для системы «популярным» будет 1% картинок с большим количеством баллов . Так что, если у меня в таблице будет 1000 картинок, только 10 картинок с большим количеством точек будут помечены как «популярные».

Итак, как может быть запрос, чтобы узнать, является ли изображение с заданным идентификатором популярным или нет?

Большое спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете использовать предложение 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;

Имейте в виду, что лучше ограничить объем данных, генерируемых подзапросом, до минимума, чтобы запрос сохранял хорошую производительность при увеличении базы данных.

Вот DB-Fiddle со всеми этими сценариями с рабочими примерами данных

...