Порядок по двум столбцам не работает

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь создать список «Трендов», в котором отображаются 10 лучших статей. Список тенденций основан на самых последних и большинстве просмотров. Вот как выглядит мой текущий SQL-запрос:

 $resultSet = $db->query("SELECT * FROM Articles ORDER BY Counter DESC, dateStamp LIMIT 10");
  

Counter это столбец, в котором хранится количество просмотров каждой статьи. dateStamp это столбец datetime, в котором хранится datetime каждой статьи. Мой текущий SQL работает для количества просмотров. Он упорядочивает статью, которая имеет наибольшее количество просмотров сверху, и статью, которая имеет наименьшее количество просмотров внизу.

Единственная проблема, с которой я сталкиваюсь с этим текущим SQL, заключается в том, что он не использует только самые последние даты. Он ищет все даты и упорядочивает запрос только на основе представлений. Статья может длиться 2 года, но у нее будет больше просмотров, поэтому она будет в списке трендов.

Как я могу сделать так, чтобы запрос упорядочивал результаты на основе как последних, так и большинства просмотров?

Пример данных:

Дата: 8/1/15 Просмотров: 20 000

Дата: 9/30/16 Просмотров: 500

Дата: 28.09.16 Просмотров: 400

Дата: 25.09.16 Просмотров: 150

Дата: 22.09.16 Просмотров: 100

Дата: 21.09.16 Просмотров: 98

Дата: 20.09.16 Просмотров: 92

Дата: 18.09.16 Просмотров: 10

Дата: 15.09.16 Просмотров: 5

Дата: 9/12/16 Просмотров: 3

Технически данные должны выглядеть следующим образом:

Дата: 9/30/16 Просмотров: 500

Дата: 28.09.16 Просмотров: 400

Дата: 25.09.16 Просмотров: 150

Дата: 22.09.16 Просмотров: 100

Дата: 21.09.16 Просмотров: 98

Дата: 20.09.16 Просмотров: 92

Дата: 18.09.16 Просмотров: 10

Дата: 15.09.16 Просмотров: 5

Дата: 9/12/16 Просмотров: 3

Дата: 11.09.16 Просмотров: 2

Это не упорядочивает самые последние даты. Мне это нужно для организации самых последних дат и большинства просмотров. Часть представлений работает правильно, это просто даты, которых нет.

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

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

2. Ваши варианты: большинство просмотров ограничено разумным периодом, самые последние ограничены разумным количеством просмотров, максимальное количество весовых функций с разумными весами просмотров и периода.

3. @GordonLinoff Я обновил вопрос, пожалуйста, проверьте

4. Но 10 лучших последних дат не обязательно совпадают с 10 лучшими по количеству просмотров. Эти два совершенно не связаны друг с другом. Вы не очень хорошо продумали, что именно вы хотите.

5. @MikeNakis Я хочу, чтобы самые последние даты были упорядочены в зависимости от количества просмотров, которые у них есть.

Ответ №1:

Вот как получить 10 самых последних записей:

 SELECT * FROM Articles ORDER BY dateStamp DESC LIMIT 10;
  

Вот как упорядочить по убыванию просмотров:

 SELECT ... ORDER BY Counter DESC;
  

Два объединенных:

 SELECT *
FROM (SELECT * FROM Articles ORDER BY dateStamp DESC LIMIT 10) TOP10
ORDER BY Counter DESC;
  

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

1. По какой-то причине это не выводит никаких результатов

2. @user2896120 Это должно сработать. Можете ли вы создать sqlfiddle с образцами данных?

3. Это то, что у меня есть в качестве оператора запроса: $resultSet = $cn->query("SELECT * FROM (Articles ORDER BY dateStamp DESC LIMIT 10) ORDER BY Counter DESC"); Результаты не отображаются, поэтому нет образцов данных

4. Это отличается от того, что я написал. Вам не хватает второго SELECT * FROM .

5. @user2896120 я имею в виду образец входных данных, поэтому мы можем попробовать запрос и посмотреть, работает ли он. В вашем запросе есть синтаксическая ошибка, поэтому кажется, что вы не проверяете наличие ошибок при выполнении запросов, иначе вы бы это увидели.

Ответ №2:

Я думаю, вам нужно использовать a where , чтобы ограничить отображаемые даты. order by Упорядочивает результаты на основе первого столбца. Он использует только второй столбец, если две строки имеют одинаковое значение для первого столбца.

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

1. WHERE может использоваться для ограничения его определенным диапазоном дат, но как это будет использоваться для получения самых последних 10 строк?