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

Форум MySQL

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

 

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

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

тема: Помогите составить запрос
 
 автор: OLi   (26.04.2012 в 21:18)   письмо автору
 
 

Нужно одним запросом вывести записи:
1) Вывести записи в порядке убывания, где есть rate_d>0
2) Вывести оставшиеся записи (кроме уже выведенных), в порядке убывания id (самые свежие вверху)
Если первый пункт не выполняется, просто выполнить 2-й

  Ответить  
 
 автор: Lotanaen   (27.04.2012 в 11:31)   письмо автору
 
   для: OLi   (26.04.2012 в 21:18)
 

попробуйте так:


select *, if(rate_d>0,1,0) as param from tb1 order by param desc,id desc

  Ответить  
 
 автор: OLi   (27.04.2012 в 21:25)   письмо автору
 
   для: Lotanaen   (27.04.2012 в 11:31)
 

Еще одно усложнение, сначала вывести записи с vip=1, затем rate_d>0 потом новые добавленные и затем остальные

  Ответить  
 
 автор: OLi   (28.04.2012 в 01:02)   письмо автору
 
   для: OLi   (27.04.2012 в 21:25)
 

Сделал так, но не могу понять почему не выводит сначала записи с vip=1
SELECT
  SQL_CALC_FOUND_ROWS *
FROM
  `listings`
WHERE
  status=1
order by
  case
   when vip=1 then 1
   when rate_d>0 then 2 
   when id then 3 else 4 end desc
limit 0, 5

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 09:55)   письмо автору
 
   для: OLi   (28.04.2012 в 01:02)
 

видимо не desc, а asc нужно использовать? и еще добавить id desc

  Ответить  
 
 автор: OLi   (28.04.2012 в 10:35)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 09:55)
 

id desc вызывает ошибку

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 10:44)   письмо автору
 
   для: OLi   (28.04.2012 в 10:35)
 

SELECT
  SQL_CALC_FOUND_ROWS *
FROM
  `listings`
WHERE
  status=1 
order by
  case when vip=1 then 1 
  when rate_d>0 then 2
  when id then 3 else 4 end asc, id desc
limit 0, 5

так не работает?

  Ответить  
 
 автор: OLi   (28.04.2012 в 10:48)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 10:44)
 

Работает - спасибо
Только вот не отсортировывает по rate_d в порядке убывания:
"SELECT SQL_CALC_FOUND_ROWS 

            * FROM `listings` ".$where."  order by  case when vip=1 then 0 when rate_d>0 then 1 when id   then 2 end  
            asc, id desc limit ".($page*$per_page).", ".$per_page.""

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 10:52)   письмо автору
 
   для: OLi   (28.04.2012 в 10:48)
 

when id then 3 наверное лишнее в запросе, если id это автоинкримент

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 10:54)   письмо автору
 
   для: OLi   (28.04.2012 в 10:48)
 

порядке убывания чего? по какому полю-значению?

  Ответить  
 
 автор: OLi   (28.04.2012 в 10:59)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 10:54)
 

в порядке убывания значений поля rate_d т-е от 100 до 1 (Сверху-вниз)

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 11:05)   письмо автору
 
   для: OLi   (28.04.2012 в 10:59)
 

попробуйте таким образом:


"SELECT SQL_CALC_FOUND_ROWS 

            * FROM `listings` ".$where."  order by  case when vip=1 then 0 else 1 end  
            asc, rate_d desc,  id desc limit ".($page*$per_page).", ".$per_page.""

  Ответить  
 
 автор: OLi   (28.04.2012 в 11:11)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 11:05)
 

Работает, но после rate_d уже не выводит последние добавленные по id и при такой записи вышли записи с повтором для vip=1

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 12:01)   письмо автору
 
   для: OLi   (28.04.2012 в 11:11)
 


"SELECT SQL_CALC_FOUND_ROWS 

            * FROM `listings` ".$where."  order by  case when vip=1 then 0 when rate_d>0 then rate_d when id   then 10000 end  
            asc, id desc limit ".($page*$per_page).", ".$per_page.""

попробуйте таким образом

  Ответить  
 
 автор: OLi   (28.04.2012 в 13:13)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 12:01)
 

Отлично, только осталось rate_d вывести в обратном порядке

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

тогда вот так:



"SELECT SQL_CALC_FOUND_ROWS 

            * FROM `listings` ".$where."  order by  case when vip=1 then 10000 when rate_d>0 then rate_d when id   then 0 end  
            desc, id desc limit ".($page*$per_page).", ".$per_page."" 

  Ответить  
 
 автор: OLi   (28.04.2012 в 13:23)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 13:21)
 

Теперь новые где-то очень далеко))

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 13:26)   письмо автору
 
   для: OLi   (28.04.2012 в 13:23)
 

новые после вип=1 и где рэйт_д>0 как Вы и говорили изначально или условия поменялись?

  Ответить  
 
 автор: OLi   (28.04.2012 в 13:33)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 13:26)
 

Верно - сначала vip потом rate_d>0 затем последние обавленные

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 13:35)   письмо автору
 
   для: OLi   (28.04.2012 в 13:33)
 

ид - это же у вас идентификатор записи? возрастает при добавлении новых?

  Ответить  
 
 автор: OLi   (28.04.2012 в 13:39)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 13:35)
 

да - возрастает

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 13:57)   письмо автору
 
   для: OLi   (28.04.2012 в 13:39)
 

новые сейчас у вас выводятся после условия рэйт_д>0 в порядке убывания

  Ответить  
 
 автор: OLi   (28.04.2012 в 14:05)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 13:57)
 

у меня новые записи щас ушли в самый конец, а не в самый верх

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 14:07)   письмо автору
 
   для: OLi   (28.04.2012 в 14:05)
 

попробуйте when id>0 вместо when id

  Ответить  
 
 автор: OLi   (28.04.2012 в 14:12)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 14:07)
 

Странно - но не сработало

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 14:21)   письмо автору
 
   для: OLi   (28.04.2012 в 14:12)
 

а если заменить when id на else 0?

  Ответить  
 
 автор: OLi   (28.04.2012 в 14:23)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 14:21)
 

Тогда так: Warning: mysql_num_rows(): supplied argument is not a valid MySQL

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 14:27)   письмо автору
 
   для: OLi   (28.04.2012 в 14:23)
 

then 0 последнее тоже убрать нужно

  Ответить  
 
 автор: OLi   (28.04.2012 в 14:34)   письмо автору
 
   для: Lotanaen   (28.04.2012 в 14:27)
 

Ох, вот запрос, все тоже самое:

"SELECT SQL_CALC_FOUND_ROWS  

            * FROM `listings` ".$where."  order by  case when vip=1 then 10000 when rate_d>0 then rate_d else 0 end  
            desc, id desc limit ".($page*$per_page).", ".$per_page.""   

  Ответить  
 
 автор: Lotanaen   (28.04.2012 в 16:36)   письмо автору
 
   для: OLi   (28.04.2012 в 14:34)
 



"SELECT SQL_CALC_FOUND_ROWS  

            *, if(vip=1,10000,if(rate_d>0,rate_d,0)) as param FROM `listings` ".$where."  order by  param  
            desc, id desc limit ".($page*$per_page).", ".$per_page."" 


а так тоже не то что нужно получается?

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

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