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

Форум MySQL

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

 

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

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

тема: Сортировка по двум столбцам в разных направлениях
 
 автор: provodnik   (20.08.2007 в 17:09)   письмо автору
 
 

Доброго времени суток.
Прошу совета, никак не могу сообразить.
Ситуация следующая:
Есть доска объявлений. Присутствует возможность присваивать некоторым объявлениям статус VIP.
Как мне вывести в общую кучу строки из MySql отсортировав их по дате добавления, но строки со статусом VIP должны появляться первыми, не смотря на сортировку по дате?

Поля примерно такие:
id | time | vip
Где time - время UNIX, а флаг vip - int ( 1 или 0 )

Я бы вывел всё это дело двумя запросами, да всё упирается в постраничную навигацию...

Заранее благодарен...

   
 
 автор: oradev   (20.08.2007 в 18:48)   письмо автору
 
   для: provodnik   (20.08.2007 в 17:09)
 

Так ?

order by vip desc, time desc

   
 
 автор: provodnik   (21.08.2007 в 11:05)   письмо автору
 
   для: oradev   (20.08.2007 в 18:48)
 

Несовсем.
Пишу так:

<?
ORDER by vip ASC
id DESC
?>

Сортируется всё правильно, но выводится в порядке: сначала по #id, а потом по vip.
А требуется наоборот: сначала выводить VIPовские, а потом остальные в обратном порядке....

   
 
 автор: oradev   (21.08.2007 в 23:01)   письмо автору
 
   для: provodnik   (21.08.2007 в 11:05)
 

Привидите на примере чего вы именно хотите получить.

   
 
 автор: provodnik   (22.08.2007 в 11:01)   письмо автору
 
   для: oradev   (21.08.2007 в 23:01)
 

Привожу примерное строение БД:

id | vip
1 | 0
2 | 0
3 | 1
4 | 0
5 | 0
6 | 0
7 | 1
8 | 1
9 | 0
10 | 0
11 | 1

Хочется получить следующую сортировку:
11
8
7
3
10
9
6
5
4
2
1

Но получается вывод сначала по id, а потом уже по vip:
10
9
6
5
4
2
1
11
8
7
3

Заранее спасибо...

   
 
 автор: oradev   (22.08.2007 в 11:53)   письмо автору
 
   для: provodnik   (22.08.2007 в 11:01)
 


SELECT *
  FROM (SELECT   ID
            FROM tab
           WHERE vip = 1
        ORDER BY ID DESC) t1
UNION ALL
SELECT *
  FROM (SELECT   ID
            FROM tab
           WHERE vip = 0
        ORDER BY ID DESC) t2;

   
 
 автор: provodnik   (22.08.2007 в 16:10)   письмо автору
 
   для: oradev   (22.08.2007 в 11:53)
 

Прокомментируйте пожалуйста код, если не затруднит.
Вечером обязательно его испробую...

И какие переменные у меня будут на выходе? Т.е. как мне к ним обращаться?
А то я данный пример запроса вижу впервые, и что то затрудняюсь...

Заранее благодарен

   
 
 автор: Faraon   (22.08.2007 в 16:34)   письмо автору
 
   для: provodnik   (22.08.2007 в 16:10)
 

На выходе будет t1 и t2

   
 
 автор: oradev   (22.08.2007 в 22:29)   письмо автору
 
   для: Faraon   (22.08.2007 в 16:34)
 



SELECT t1.ID
  FROM (SELECT   ID
            FROM tab
           WHERE vip = 1
        ORDER BY ID DESC) t1
UNION ALL
SELECT *
  FROM (SELECT   ID
            FROM tab
           WHERE vip = 0
        ORDER BY ID DESC) t2;



Запрос сначала возвращает id у которых vip = 1 отсортированные убыванию id,
а далее объединяется с запросом, возвращающим id у которых vip = 0 также отросортированные по убыванию.

   
 
 автор: provodnik   (23.08.2007 в 15:06)   письмо автору
 
   для: oradev   (22.08.2007 в 22:29)
 

Ээх. Нужно мне было сразу просить у Вас готовый пример. А я думал, что сам смогу слепить....
Помогите мне присовокупить мой старый запрос к Вашему новому, а то я два часа потерял, экспериментировал... Так и неполучилось ничего...

Таблица с данными data
Таблица с категориями data_cat
Мой старый запрос с неудачной сортировкой:

query = mysql_query("
SELECT A.id as data_id, A.*, B.*           
FROM data as A, data_cat as B             
WHERE A.id_category = B.id         // связываем таблицы
AND A.old_mess = 'old'             // выбираем только старые данные
AND A.id_category = ".$_GET['id_cat']."    // выбираем категорию, которая пришла по GET
ORDER by vip, data_id DESC        // моя неудачная попытка сортировки
LIMIT $start, $COUNT_SHOW_BOARD// постраничная навигация
");

Заранее благодарен...

   
 
 автор: oradev   (23.08.2007 в 18:01)   письмо автору
 
   для: provodnik   (23.08.2007 в 15:06)
 

Поможем, если автор привидет структуру таблиц data, data_cat и связи мехду ними.

   
 
 автор: oradev   (24.08.2007 в 00:07)   письмо автору
 
   для: oradev   (23.08.2007 в 18:01)
 


SQL> select * from dat;

ID_CATAGORY OLD_MESS                                                            
----------- ------------------------------                                      
          1 old                                                                 
          2 old                                                                 
          3 old                                                                 
          4 new                                                                 
          5 old                                                                 

SQL> select * from data_cat;

        ID        VIP    DATA_ID                                                
---------- ---------- ----------                                                
         1          1          1                                                
         2          0          2                                                
         3          1          3                                                
         4          0          4                                                
         4          1          5                                                
         5          0          6                                                
         3          1          7                                                

7 строк выбрано.

SQL> SELECT d_id, v, cat, mes
  2    FROM (SELECT   dc.data_id d_id, dc.vip v, d.id_catagory cat, d.old_mess mes
  3              FROM data_cat dc JOIN dat d ON (dc.ID = d.id_catagory)
  4             WHERE d.old_mess = 'old' AND dc.vip = 1
  5          ORDER BY data_id DESC) tab
  6  UNION ALL
  7  SELECT d_id, v, cat, mes
  8    FROM (SELECT   dc.data_id d_id, dc.vip v, d.id_catagory cat, d.old_mess mes
  9              FROM data_cat dc JOIN dat d ON (dc.ID = d.id_catagory)
 10             WHERE d.old_mess = 'old' AND dc.vip = 0
 11          ORDER BY data_id DESC) tab;

      D_ID          V        CAT MES                                            
---------- ---------- ---------- ------------------------------                 
         7          1          3 old                                            
         3          1          3 old                                            
         1          1          1 old                                            
         6          0          5 old                                            
         2          0          2 old   

   
 
 автор: provodnik   (24.08.2007 в 10:55)   письмо автору
 
   для: oradev   (24.08.2007 в 00:07)
 

oradev - огромное спасибо за потраченное на меня время. Но Вы ошиблись с предполагаемой структурой таблиц. Прошу меня простить стервеца, что не показал структуру изначально:

Таблица data:

CREATE TABLE `data` (
  `id` int(11) NOT NULL auto_increment,
  `id_category` int(11) NOT NULL default '0',
  `autor` varchar(32) NOT NULL default '',
  `title` varchar(255) NOT NULL default '',
  `email` varchar(32) NOT NULL default '',
  `address` varchar(255) NOT NULL default '',
  `phone` varchar(255) NOT NULL default '',
  `text` text NOT NULL,
  `hits` int(11) NOT NULL default '0',
  `type` enum('S','P') NOT NULL default 'P',
  `old_mess` enum('new','old') NOT NULL default 'new',
  `vip` int(1) NOT NULL default '0',
  `time` int(11) NOT NULL default '0',
  `time_delete` enum('7','14','30','60','90','180','365') NOT NULL default '30',
  `pass_delete` varchar(15) NOT NULL default '',
  `last_edit` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=1 ;


Это полное строение... На выходе мне нужно иметь из неё ВСЕ столбцы....

Таблица data_cat

CREATE TABLE data_cat` (
  `id` int(11) NOT NULL auto_increment,
  `root_category` int(11) NOT NULL default '0',
  `name_cat` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `img` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

Где id из таблицы data_cat равен id_category в таблице data

Попробую откорректировать задачу заново:
Необходимо выбрать данные из таблиц data, data_cat
где id_category в таблице data равен $_GET['id_cat'] (т.е. данные, принадлежащие одной категории, пришедшей по ГЕТ),
где old_mess равен "old",
в порядке DESC (т.е. самая "свежая" строка с данными должна стоять первой. Я сортировал по ID, т.к. по time работало как то некорректно)
с LIMIT $start, $COUNT_SHOW_BOARD (это для постраничной навигации),
Но что бы сначала шли данные, у которых vip из таблицы data был равен "1", а потом, где vip равен "0"...

oradev - будьте любезны, не сокращайте код (я имею ввиду "AS" ). А то очень сложно потом этот код разбирать, что бы понять что к чему...

Заранее благодарен...

   
 
 автор: Thrasher   (24.08.2007 в 11:32)   письмо автору
 
   для: provodnik   (22.08.2007 в 11:01)
 

Но получается вывод сначала по id, а потом уже по vip:
10
9
6
5
4
2
1
11
8
7
3

Ваш вывод соответствует такому запросу:

<? 
select 
from tbl ORDER by vip ASCid DESC 
?>


Сделайте

<? 
select 
from tbl ORDER by vip DESCid DESC 
?>

и получите
Хочется получить следующую сортировку:
11
8
7
3
10
9
6
5
4
2
1

   
 
 автор: provodnik   (24.08.2007 в 12:06)   письмо автору
 
   для: Thrasher   (24.08.2007 в 11:32)
 

Хм, Thrasher, где же Вы были раньше... Гениально... И просто всё блин...
Thrasher - сильно благодарен...
А я же блин как только не пробовал:
и

select * from tbl ORDER by vip, id DESC

и

select * from tbl ORDER by vip ASC, id DESC

А скрипт всё равно не хотел выводить как нужно...

oradev - огромное спасибо за потраченные на меня усилия и время...
Но Вы меня "попугали" монстровыми запросами...

   
 
 автор: Thrasher   (24.08.2007 в 12:12)   письмо автору
 
   для: provodnik   (24.08.2007 в 12:06)
 

Вам это решение было дано уже во втором посте этого топика, но вы его применили не внимательно, заменили desc на asc, и поэтому получили не верный результат.

   
 
 автор: oradev   (24.08.2007 в 12:50)   письмо автору
 
   для: Thrasher   (24.08.2007 в 12:12)
 

Автор все же в следующий раз получше всматривайтесь в топики сначала.

   
 
 автор: provodnik   (24.08.2007 в 13:24)   письмо автору
 
   для: oradev   (24.08.2007 в 12:50)
 

Прошу меня извинить, стервеца...

Я вначале действительно хотел сортировать так, как написал в 3-м посте, т.е. vip по ASC, a id по DESC. Но потом смирился. И поменял задачу... А в начало темы смотреть уже было не судьба..

Еще раз спасибо за помощь...

   
Rambler's Top100
вверх

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