|
|
|
| Доброго времени суток.
Прошу совета, никак не могу сообразить.
Ситуация следующая:
Есть доска объявлений. Присутствует возможность присваивать некоторым объявлениям статус VIP.
Как мне вывести в общую кучу строки из MySql отсортировав их по дате добавления, но строки со статусом VIP должны появляться первыми, не смотря на сортировку по дате?
Поля примерно такие:
id | time | vip
Где time - время UNIX, а флаг vip - int ( 1 или 0 )
Я бы вывел всё это дело двумя запросами, да всё упирается в постраничную навигацию...
Заранее благодарен... | |
|
|
|
|
|
|
|
для: provodnik
(20.08.2007 в 17:09)
| | Так ?
order by vip desc, time desc
|
| |
|
|
|
|
|
|
|
для: oradev
(20.08.2007 в 18:48)
| | Несовсем.
Пишу так:
<?
ORDER by vip ASC, id DESC
?>
|
Сортируется всё правильно, но выводится в порядке: сначала по #id, а потом по vip.
А требуется наоборот: сначала выводить VIPовские, а потом остальные в обратном порядке.... | |
|
|
|
|
|
|
|
для: provodnik
(21.08.2007 в 11:05)
| | Привидите на примере чего вы именно хотите получить. | |
|
|
|
|
|
|
|
для: 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
Заранее спасибо... | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: oradev
(22.08.2007 в 11:53)
| | Прокомментируйте пожалуйста код, если не затруднит.
Вечером обязательно его испробую...
И какие переменные у меня будут на выходе? Т.е. как мне к ним обращаться?
А то я данный пример запроса вижу впервые, и что то затрудняюсь...
Заранее благодарен | |
|
|
|
|
|
|
|
для: provodnik
(22.08.2007 в 16:10)
| | На выходе будет t1 и t2 | |
|
|
|
|
|
|
|
для: 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 также отросортированные по убыванию. | |
|
|
|
|
|
|
|
для: 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// постраничная навигация
");
|
Заранее благодарен... | |
|
|
|
|
|
|
|
для: provodnik
(23.08.2007 в 15:06)
| | Поможем, если автор привидет структуру таблиц data, data_cat и связи мехду ними. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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" ). А то очень сложно потом этот код разбирать, что бы понять что к чему...
Заранее благодарен... | |
|
|
|
|
|
|
|
для: 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 ASC, id DESC
?>
|
Сделайте
<?
select * from tbl ORDER by vip DESC, id DESC
?>
|
и получите
Хочется получить следующую сортировку:
11
8
7
3
10
9
6
5
4
2
1 | |
|
|
|
|
|
|
|
для: 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 - огромное спасибо за потраченные на меня усилия и время...
Но Вы меня "попугали" монстровыми запросами... | |
|
|
|
|
|
|
|
для: provodnik
(24.08.2007 в 12:06)
| | Вам это решение было дано уже во втором посте этого топика, но вы его применили не внимательно, заменили desc на asc, и поэтому получили не верный результат. | |
|
|
|
|
|
|
|
для: Thrasher
(24.08.2007 в 12:12)
| | Автор все же в следующий раз получше всматривайтесь в топики сначала. | |
|
|
|
|
|
|
|
для: oradev
(24.08.2007 в 12:50)
| | Прошу меня извинить, стервеца...
Я вначале действительно хотел сортировать так, как написал в 3-м посте, т.е. vip по ASC, a id по DESC. Но потом смирился. И поменял задачу... А в начало темы смотреть уже было не судьба..
Еще раз спасибо за помощь... | |
|
|
|