У меня следующая структура таблицы:
+----------+------------------------+------+-----+------------------------------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------------+------+-----+------------------------------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| body | varchar(200) | NO | | Hey now! | |
| flags | int(10) unsigned | NO | | 0 | |
| views | int(10) unsigned | NO | | 1 | |
+----------+------------------------+------+-----+------------------------------------------+----------------+
и я хочу выбрать «только те строки, которые не были отмечены более чем на 5% их общего количества просмотров и были просмотрены не менее 5 раз».
Вот мой запрос:
SELECT id,body
FROM tablename
WHERE id NOT IN (
SELECT id
FROM tablename
WHERE flags/views * 100 > 5.0
AND views > 5
ORDER BY id DESC
)
ORDER BY id DESC
LIMIT 6
Я думаю, что выбор «каждой отдельной строки, которая помечена более чем на 30% от общего числа просмотров», потребует огромных накладных расходов, особенно когда таблица увеличивается до очень большого числа строк. Может ли кто-нибудь помочь мне оптимизировать это?
Я также думал о создании столбца «flag_score» и просто обновлял его каждый раз, когда что-то помечено, таким образом, я мог просто выбирать столбец flag_score вместо выполнения математических операций внутри выбора (и сохранять свой дополнительный запрос выбора ). Это звучит как хороший подход? Спасибо большое.
Редактировать: Другая проблема, с которой я столкнулся, заключается в том, что если я просто сделаю что-то вроде:
SELECT *
FROM tabelname
WHERE flags/views * 100 > 5.0
AND views > 5
ORDER BY id DESC
LIMIT 5
... если 4 из 5 сообщений помечены, он вернет только 1 строку! И я хотел бы, чтобы оператор возвращал 5 строк.