Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: SQL: отсортировать половину таблицы по одному столбцу, а оставшуюся - по другому
 
 автор: OLi   (23.04.2011 в 02:48)   письмо автору
 
 

Доброго! Возможно ли одним запросом вывести информацию из таблицы в такой последовательности:
1) Все записи где rating>0 отсортировав по rating, а следом без повторения уже выведенных - записи отсортированные по id и где rating=0?

  Ответить  
 
 автор: cheops   (23.04.2011 в 09:00)   письмо автору
 
   для: 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

  Ответить  
 
 автор: OLi   (25.04.2011 в 12:41)   письмо автору
 
   для: 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:46)   письмо автору
 
   для: OLi   (25.04.2011 в 12:41)
 

В принципе запрос выводит то что надо, но если id = максимальному и rating = 0 то приоритете отдает сортировке по rating, т-е не выводит по в самый вверх по id

  Ответить  
 
 автор: cheops   (25.04.2011 в 13:21)   письмо автору
 
   для: OLi   (25.04.2011 в 12:46)
 

Не очень понятно, если rating = 0, то сортировка в этой группе идет не правильно?

  Ответить  
 
 автор: OLi   (25.04.2011 в 13:58)   письмо автору
 
   для: cheops   (25.04.2011 в 13:21)
 

Давайте тогда объясню структуру и логику сначала:
В таблице есть записи с id rating
Сформировать вывод на страницу надо таким образом:
Выводить в самый верх новые добавленные записи за сегодня, ниже отображаются записи без повторения уже выведенных,отсортированные по rating и оставшиеся (rating=0)

Новые за сегодня
-------------------------
Записи где rating >0 (отсортированные)
-------------------------
Остальные где rating =0
------------------------
Остальные

#############
При повышении рейтинга (клику на +) в базе происходит обновление rating+1, и эта запись должна отобразиться самой первой над "Новые за сегодня"
А все что было ниже - так и остается

  Ответить  
 
 автор: cheops   (25.04.2011 в 14:49)   письмо автору
 
   для: 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

  Ответить  
 
 автор: OLi   (25.04.2011 в 15:07)   письмо автору
 
   для: cheops   (25.04.2011 в 14:49)
 

Хм странно, но такой запрос выводит в самый низ запись с id = 580 (максимальным) а должно быт вверху

  Ответить  
 
 автор: OLi   (25.04.2011 в 15:10)   письмо автору
 
   для: OLi   (25.04.2011 в 15:07)
 

Т-е последние, скажем 5 (по id) записей надо отобразить в самом верху

  Ответить  
 
 автор: cheops   (25.04.2011 в 15:19)   письмо автору
 
   для: OLi   (25.04.2011 в 15:07)
 

А рейтинг у id = 580 какой?

  Ответить  
 
 автор: OLi   (25.04.2011 в 15:26)   письмо автору
 
   для: cheops   (25.04.2011 в 15:19)
 

rating для id=580 равен 0

  Ответить  
 
 автор: cheops   (25.04.2011 в 15:33)   письмо автору
 
   для: OLi   (25.04.2011 в 15:26)
 

Тогда он у нас автоматически уходит во вторую группу, располагающуюся между теми у кого рейтинг больше 0 и теми у кого он отрицательный. Или вам нужно, чтобы наиболее новые позиции оказывались выше? Тогда для id нужно добавить DESC, как вы делали раньше.

  Ответить  
 
 автор: OLi   (25.04.2011 в 16:01)   письмо автору
47.1 Кб
 
   для: cheops   (25.04.2011 в 15:33)
 

Да, верно, добавил id DESC, вот что получил (скрин)
Как видно, 580 не там где надо...

  Ответить  
 
 автор: cheops   (25.04.2011 в 16:15)   письмо автору
 
   для: OLi   (25.04.2011 в 16:01)
 

А где вы его хотите увидеть? Насколько я понял из описания все верно (у него же рейтинг 0, т.е. он не может подниматься выше тех позиций, у которых рейтинг выше 0).

  Ответить  
 
 автор: OLi   (25.04.2011 в 16:46)   письмо автору
 
   для: cheops   (25.04.2011 в 16:15)
 

тогда может при добавлении записи заносить в рейтинг -1 и потом отображать...просто теряется логика..
как вариант выводить сначала первые 5 последних записей по убывающим id и рейтингом = -1
потом выводить все записи по убыванию rating (>0) а заем все остальные.
Но фишка в том, что когда я жму +1 для rating любой записи - она должна отобразиться уже выше самых первых записей...т-е тут условия уже правильно не сработают...может при увеличении на 1

Я думаю, что логика построения у меня не правильная...
1) Вывести 5 последних записей (самый вверх)
2) следом все записи отсортированные по rating (rating>0)
3) остальные

#####
Если для записи произошло rating+1 то она отображается в самом верху, следом все что было раньше....

  Ответить  
 
 автор: cheops   (25.04.2011 в 17:00)   письмо автору
 
   для: OLi   (25.04.2011 в 16:46)
 

Может тогда просто двумя запросами обойтись? Выбрать первые 5 позиций, сохранить их id и сформировать из них список, который использовать в следующем запросе для исключения этих записей? Получится два запроса, зато очень простых. Мы просто сейчас в LIMIT-ы уйдем, а они в MySQL не очень эффективные.

  Ответить  
 
 автор: OLi   (25.04.2011 в 19:23)   письмо автору
 
   для: cheops   (25.04.2011 в 17:00)
 

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

  Ответить  
 
 автор: cheops   (25.04.2011 в 21:17)   письмо автору
 
   для: OLi   (25.04.2011 в 19:23)
 

Ну к ним будет применяться та же самая логика? Тогда все точно также. Если нет, нужно более подробно описать, как будет изменяться положение позиций в сортировки со временем и возникновением событий.

PS Что за клик и кто его осуществляет? У нас первыми выводятся новые сообщения или с самым высоким рейтингом или с рейтингом, который изменился сегодня?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования