2015-09-02 3 views
1

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

Это было то, что я был первым:

SELECT 
    @rownum := @rownum + 1 AS rank, 
    sticker_id, 
    total_shared, 
    total_liked, 
    total_used, 
    total_shared+total_liked+total_used AS points, 
    stickers.date 
FROM( 
    SELECT 
     sticker_id, 
     SUM(if(event_id = 1, 4, 0)) AS total_shared, 
     SUM(if(event_id = 2, 2, 0)) AS total_liked, 
     SUM(if(event_id = 3, 6, 0)) AS total_used 
    FROM stickers_stats 
    WHERE timestamp LIKE '2015-09%' 
    GROUP BY sticker_id 
) AS ranks 
JOIN (SELECT @rownum := 0) r 
INNER JOIN stickers 
    ON ranks.sticker_id = stickers.id 
ORDER BY points DESC 

РЕЗУЛЬТАТ:

First result


Это было то, что я получил после того, как:

SELECT 
    @rownum := @rownum + 1 AS rank, 
    sticker_id, 
    total_shared, 
    total_liked, 
    total_used, 
    total_shared+total_liked+total_used AS points, 
    stickers.date 
FROM( 
    SELECT 
     sticker_id, 
     SUM(if(event_id = 1, 4, 0)) AS total_shared, 
     SUM(if(event_id = 2, 2, 0)) AS total_liked, 
     SUM(if(event_id = 3, 6, 0)) AS total_used 
    FROM stickers_stats 
    WHERE timestamp LIKE '2015-09%' 
    GROUP BY sticker_id 
) AS ranks 
JOIN (SELECT @rownum := 0) r 
INNER JOIN stickers 
    ON ranks.sticker_id = stickers.id 
ORDER BY points DESC, stickers.date ASC 

РЕЗУЛЬТАТ: Second result

Я попытался изменить порядок отображения полей и всего, но я не могу найти решение. Как мне заказать по points и stickers.date с новыми позициями?

ответ

1

MySQL может запутаться при запуске смешивания переменных с другими конструкциями. Я не уверен, что советы ваш запрос через край, но с использованием подзапроса должно помочь:

SELECT @rownum := @rownum + 1 AS rank, t.* 
FROM (SELECT sticker_id, total_shared, total_liked, total_used, 
      (total_shared + total_liked + total_used) AS points, 
      s.date 
     FROM (SELECT sticker_id, 
        SUM(if(event_id = 1, 4, 0)) AS total_shared, 
        SUM(if(event_id = 2, 2, 0)) AS total_liked, 
        SUM(if(event_id = 3, 6, 0)) AS total_used 
      FROM stickers_stats 
      WHERE timestamp >= '2015-09-01' and timestamp < '2015-10-01' 
      GROUP BY sticker_id 
     ) r JOIN 
      stickers s 
      ON r.sticker_id = s.id 
    ) t CROSS JOIN 
    (SELECT @rownum := 0) params 
ORDER BY points DESC, date ASC; 

также:

  • Не используйте LIKE для значений даты/времени.
  • Всегда используйте предложение ON с JOIN. Если вы хотите CROSS JOIN, будьте ясными.
+0

Спасибо за ваш ответ, он мне очень помог – rafamds

1

Я, как правило, предпочитаю форсировать заказ в рамках дополнительного запроса. Он по-прежнему не обязательно работает (у MySQL есть некоторые пункты вывода на инструкции заказа, которые будут выполняться в запросе), но кажется более надежным.

В этом случае я хотел бы предложить, что вы джойн к наклейкам внутри подзапроса, а также: -

SELECT 
    @rownum := @rownum + 1 AS rank, 
    sticker_id, 
    total_shared, 
    total_liked, 
    total_used, 
    total_shared+total_liked+total_used AS points, 
    stickers_date 
FROM( 
    SELECT 
     sticker_id, 
     stickers.date AS stickers_date, 
     SUM(if(event_id = 1, 4, 0)) AS total_shared, 
     SUM(if(event_id = 2, 2, 0)) AS total_liked, 
     SUM(if(event_id = 3, 6, 0)) AS total_used 
    FROM stickers_stats 
    INNER JOIN stickers 
    ON stickers_stats.sticker_id = stickers.id 
    WHERE YEAR(timestamp) = 2015 
    AND MONTH(timestamp) = 9 
    GROUP BY sticker_id, stickers_date 
    ORDER BY points DESC, stickers_date ASC 
) AS ranks 
CROSS JOIN (SELECT @rownum := 0) r 
ORDER BY points DESC, stickers.date ASC 
+0

Спасибо за ваш ответ, он мне помог много. Гордон был быстрее;) – rafamds

+0

Нет проблем. Ответ Гордонов, вероятно, тоже прекрасен, и он заслуживает принятия, я просто предпочитаю принудительно упорядочить внутри суб-запроса, чтобы сделать его более явным, что он подсчитывает уже упорядоченный набор данных. – Kickstart

+0

Да, я понимаю, и я согласен с этим. ура – rafamds

Смежные вопросы