Вычисление количества полей с использованием MAX и MIN

#mysql #max #min

#mysql #максимальное #min

Вопрос:

Вкратце, цель запроса состоит в том, чтобы перечислить все записи в соответствии с его оценкой, которая рассчитывается в соответствии с вычислением оценок даты, просмотров и рейтинга

  SELECT
          p.id
         , p.date
         , p.title
         , r.module
         , r.module_id
         , IFNULL(v.total_views,0)  AS views
         , r.total_rating           AS rating

     #the following formula calculates the Score 10*(MAX(points)-(points))/(MAX(points)-MIN(points))

    , round((round(10-(((PD.MaxDate-p.date)/(PD.MaxDate-PD.MinDate))*10), 3)   round(10-(((MAX(v.total_views)-v.total_views)/(MAX(v.total_views)-MIN(v.total_views)))*10), 3)   round(10-(((MAX(r.total_rating)-r.total_rating)/(MAX(r.total_rating)-MIN(r.total_rating)))*10), 3))/3, 3) AS Score


  FROM  posts p

  LEFT  JOIN ( SELECT ra.module_id
              , ra.module   AS module
              , SUM(ra.ilike)    AS total_rating
           FROM rates ra
          WHERE ra.module = 'posts'
          GROUP
             BY ra.module_id
       ) r ON r.module_id = p.id

  LEFT  JOIN ( SELECT pv.post_id
              , SUM(1)    AS total_views
           FROM posts_views pv
          GROUP
             BY pv.post_id
       ) v ON v.post_id = p.id

   JOIN (SELECT MIN(date) AS MinDate, MAX(date) AS MaxDate FROM posts) PD


    ORDER BY Score DESC
  

Проблема с запросом заключается в том, что он выдает результат только в 1 строке вместо отображения всех записей.

Я думаю, что проблема заключается в использовании MAX () и MIN () без отделения их от запроса LEFT JOIN, используемого для получения СУММЫ () рейтинга и просмотров.

MCVEhttp://sqlfiddle.com /#!9/70d1ec/1

Комментарии:

1. Вы уже определили проблему. О чем вы просите?

2. Проблема с запросом заключается в том, что он выдает результат только в 1 строке вместо отображения всех записей. Мне нужно исправить запрос, чтобы он показывал все записи, а не только 1 строку.

3. Да, и, как вы сказали, проблема в том, что вы используете MAX и MIN, которые объединяют ваш результирующий набор в одну строку. Итак, вам нужно переместить ваши вычисления MAX и MIN во вложенный запрос, чтобы сохранить полный набор результатов во внешнем запросе.

4. Я не могу этого сделать.

5. Попробуйте добавить что-то вроде JOIN ( SELECT MAX(t.total) AS max_views, MIN(t.total) AS min_views FROM ( SELECT COUNT(*) as total FROM posts_views GROUP BY post_id ) t ) mv к вашему запросу. Это даст вам mv.max_views и mv.min_views, которые вы можете использовать вместо MAX () и MIN ()

Ответ №1:

Ответом было добавление следующих строк спасибо за Ивар Бонсаксен:

 JOIN ( SELECT MAX(t.total) AS max_views, MIN(t.total) AS min_views FROM ( SELECT COUNT(*) as total FROM posts_views GROUP BY post_id ) t ) mv
JOIN ( SELECT MAX(t.total) AS max_rates, MIN(t.total) AS min_rates FROM ( SELECT COUNT(*) as total FROM rates GROUP BY module_id ) t ) mr