Столбец суммы на отдельном счетчике при достижении определенного значения - PullRequest
1 голос
/ 19 марта 2019
CREATE TABLE `vote_days` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `t_id` int(11) NOT NULL COMMENT 'title id',
 `r_id` int(11) NOT NULL COMMENT 'release id',
 `l_id` int(11) NOT NULL COMMENT 'language id',
 `e_id` int(11) DEFAULT NULL COMMENT 'episode_id',
 `unix_day` int(11) NOT NULL,
 `votes` mediumint(8) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
)

16000 ~ пример строки, разброс по годам.https://www.db -fiddle.com / f / amvnHkVnFS3YBFYUJNRcbx / 0

В этой таблице указано количество (пользовательских) голосов за каждый день (в формате отметки времени unix).

У нас есть фильмы и телепередачи.(T_id).

В телевизионных заголовках есть e_id (идентификатор эпизода), в фильмах e_id равен NULL.

В нем используются разные форматы (выпуски) и разные языки (l_id).

Вопрос: Я хочу получить сумму всех голосов за названия каждого фильма, но я хочу разделить голоса за телешоу на количество эпизодов.В определенные сроки, упорядоченные по общему количеству голосов (Самые популярные).

Есть ли более эффективный (с точки зрения производительности) способ сделать это?

SELECT
t1.*,
(SUM(t1.votes) / (CASE WHEN t1.e_id IS NULL THEN 1 ELSE COUNT(DISTINCT(e_id)) END) ) as total_votes

FROM `vote_days` t1
  GROUP BY t_id
ORDER BY total_votes  DESC

1 Ответ

1 голос
/ 19 марта 2019

В целом, я думаю, что запрос хорош для MySQL 5.7. Я не вижу способа улучшить его, если вы не перейдете на MySQL 8.x и не захотите использовать CTE.

Большое изменение, которое я бы добавил, заключается в создании индекса, который теоретически может улучшить производительность. Однако только план выполнения скажет:

create index ix1 on `vote_days` (t_id, e_id, votes);

Я бы немного улучшил синтаксис (небольшие изменения, чтобы устранить некоторые недоразумения) и перефразировал бы его как:

SELECT
  *,
  (  
    SUM(votes) / 
    CASE WHEN max(e_id) IS NULL THEN 1 ELSE COUNT(DISTINCT e_id) END
  ) as total_votes
FROM `vote_days`
GROUP BY t_id
ORDER BY total_votes DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...