#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 строк?