|
|
|
| Доброго! Возможно ли одним запросом вывести информацию из таблицы в такой последовательности:
1) Все записи где rating>0 отсортировав по rating, а следом без повторения уже выведенных - записи отсортированные по id и где rating=0? | |
|
|
|
|
|
|
|
для: OLi
(23.04.2011 в 02:48)
| | Да, это возможно, можно начать отталкиваться от следующего запроса
SELECT id, rating, IF(rating > 0, 0, 1) AS rat
FROM tbl
WHERE rating >= 0
ORDER BY rat, rating, id
|
| |
|
|
|
|
|
|
|
для: cheops
(23.04.2011 в 09:00)
| | Благодарю...Нужна помощь в небольшом модифицировании запроса:
Сейчас вывод происходит в порядке возрастания rating до 0, а мне надо в порядке убывания до 0
Затем, чтобы запись с большим id отображалась вверху всех записей, т-е выше максимального rating
Для отсортировки по rating сделал так:
SELECT id, rating, IF( rating >0, 0, 1 ) AS rat
FROM filials
WHERE rating >=0
ORDER BY rat, rating DESC , id DESC ; LIMIT 0 , 30
|
| |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 12:41)
| | В принципе запрос выводит то что надо, но если id = максимальному и rating = 0 то приоритете отдает сортировке по rating, т-е не выводит по в самый вверх по id | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 12:46)
| | Не очень понятно, если rating = 0, то сортировка в этой группе идет не правильно? | |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 13:21)
| | Давайте тогда объясню структуру и логику сначала:
В таблице есть записи с id rating
Сформировать вывод на страницу надо таким образом:
Выводить в самый верх новые добавленные записи за сегодня, ниже отображаются записи без повторения уже выведенных,отсортированные по rating и оставшиеся (rating=0)
Новые за сегодня
-------------------------
Записи где rating >0 (отсортированные)
-------------------------
Остальные где rating =0
------------------------
Остальные
#############
При повышении рейтинга (клику на +) в базе происходит обновление rating+1, и эта запись должна отобразиться самой первой над "Новые за сегодня"
А все что было ниже - так и остается | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 13:58)
| | Т.е. у вас 3 состояния? Тогда динамический столбец rat, по которому идет первичная сортировка лучше формировать не при помощи функции IF(), а при помощи CASE и WHERE-условие нам не нужно
SELECT
id,
rating,
CASE
WHEN rating > 0 THEN 0
WHEN rating = 0 THEN 1
WHEN rating < 0 THEN 2
END AS rat
FROM tbl
ORDER BY rat, rating DESC, id
|
| |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 14:49)
| | Хм странно, но такой запрос выводит в самый низ запись с id = 580 (максимальным) а должно быт вверху | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 15:07)
| | Т-е последние, скажем 5 (по id) записей надо отобразить в самом верху | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 15:07)
| | А рейтинг у id = 580 какой? | |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 15:19)
| | rating для id=580 равен 0 | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 15:26)
| | Тогда он у нас автоматически уходит во вторую группу, располагающуюся между теми у кого рейтинг больше 0 и теми у кого он отрицательный. Или вам нужно, чтобы наиболее новые позиции оказывались выше? Тогда для id нужно добавить DESC, как вы делали раньше. | |
|
|
|
|
 47.1 Кб |
|
|
для: cheops
(25.04.2011 в 15:33)
| | Да, верно, добавил id DESC, вот что получил (скрин)
Как видно, 580 не там где надо... | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 16:01)
| | А где вы его хотите увидеть? Насколько я понял из описания все верно (у него же рейтинг 0, т.е. он не может подниматься выше тех позиций, у которых рейтинг выше 0). | |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 16:15)
| | тогда может при добавлении записи заносить в рейтинг -1 и потом отображать...просто теряется логика..
как вариант выводить сначала первые 5 последних записей по убывающим id и рейтингом = -1
потом выводить все записи по убыванию rating (>0) а заем все остальные.
Но фишка в том, что когда я жму +1 для rating любой записи - она должна отобразиться уже выше самых первых записей...т-е тут условия уже правильно не сработают...может при увеличении на 1
Я думаю, что логика построения у меня не правильная...
1) Вывести 5 последних записей (самый вверх)
2) следом все записи отсортированные по rating (rating>0)
3) остальные
#####
Если для записи произошло rating+1 то она отображается в самом верху, следом все что было раньше.... | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 16:46)
| | Может тогда просто двумя запросами обойтись? Выбрать первые 5 позиций, сохранить их id и сформировать из них список, который использовать в следующем запросе для исключения этих записей? Получится два запроса, зато очень простых. Мы просто сейчас в LIMIT-ы уйдем, а они в MySQL не очень эффективные. | |
|
|
|
|
|
|
|
для: cheops
(25.04.2011 в 17:00)
| | Хорошо, а как с теми, которые будут по клику подниматься выше всех новых добавленных? | |
|
|
|
|
|
|
|
для: OLi
(25.04.2011 в 19:23)
| | Ну к ним будет применяться та же самая логика? Тогда все точно также. Если нет, нужно более подробно описать, как будет изменяться положение позиций в сортировки со временем и возникновением событий.
PS Что за клик и кто его осуществляет? У нас первыми выводятся новые сообщения или с самым высоким рейтингом или с рейтингом, который изменился сегодня? | |
|
|
|