Forum Webscript.Ru
Общие => Базы данных => Тема начата: a@mail.dux.ru от 11 Марта 2005, 23:57:04
-
Проблема с выбором уникальных полей, но сортированных по определенному принципу.
1. пробовал использовать distinct но он в MySQL не работает :(
2. сделал запрос с оператором group by. Но тут возникла другая проблема:
group by сортирует все по своему, не взирая на последующие в операторе order by параметры.
мне надо сначала отсортировать поля по mess.status desc а уж потом из выборки сделать group by (а получается наоборот)
Пожалуйста, посоветуйте что-нибудь. Запрос и таблицы - ниже
Select pupils.ID, message, status, touserID, fromuserID, firstname
From pupils, mess where
(pupils.ID=touserID and fromuserID=1)
or
(pupils.ID=fromuserID and touserID=1)
group by pupils.ID
order by mess.status desc, mess.ID desc
Таблицы
pupils - люди
mess - сообщения, которые они пишут друг другу.
"1" - это pupils.ID=1. выборка сделана под него. то есть кому он написал и кто ему написал.
после выборки должны быть уникальные люди (без повторов)
и сообщения должны быть рассортированы по принципу: сначала новые (1) а потом прочитанные (0) . Но только по одному ПОСЛЕДНЕМУ сообщению.
Но если выполнить мой запрос, то получается не так (точнеее не всегда так как надо )
даже демп привожу, что бы была именна та ситуация что и у меня. (когда выдает неправильный запрос)
CREATE TABLE `mess` (
`ID` int(11) NOT NULL auto_increment,
`touserID` int(11) NOT NULL default \'0\',
`fromuserID` int(11) NOT NULL default \'0\',
`message` text NOT NULL,
`status` tinyint(4) NOT NULL default \'1\',
PRIMARY KEY (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;
#
# Дамп данных таблицы `mess`
#
INSERT INTO `mess` VALUES (1, 1, 2, \'сообщ 2 к 1\', 0);
INSERT INTO `mess` VALUES (2, 2, 1, \'сообщ 1 к 2\', 0);
INSERT INTO `mess` VALUES (3, 1, 2, \'сообщ 2 к 1\', 1);
INSERT INTO `mess` VALUES (4, 2, 1, \'сообщ 1 к 2\', 1);
INSERT INTO `mess` VALUES (5, 1, 3, \'сообщ 3 к 1\', 0);
INSERT INTO `mess` VALUES (6, 1, 3, \'сообщ 3 к 1\', 1);
# --------------------------------------------------------
#
# Структура таблицы `pupils`
#
CREATE TABLE `pupils` (
`ID` int(11) NOT NULL auto_increment,
`firstname` varchar(30) NOT NULL default \'\',
PRIMARY KEY (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;
#
# Дамп данных таблицы `pupils`
#
INSERT INTO `pupils` VALUES (1, \'чел1\');
INSERT INTO `pupils` VALUES (2, \'чел2\');
INSERT INTO `pupils` VALUES (3, \'чел3\');
Прежде чем добавлять - изучил форум. нашел интересные решения. использовал.
В приведенных мною данных (когда мало) работает.
SELECT pupils.ID, MAX( status ) , message, touserID, fromuserID, firstname FROM pupils, mess WHERE ( pupils.ID = touserID AND fromuserID =1 ) OR ( pupils.ID = fromuserID AND touserID =1 ) GROUP BY pupils.ID ORDER BY mess.status DESC , mess.ID DESC
А по боевому, все ж НЕ так как надо.
Так что проблема актуальна. Прошу помощи.
-
a@mail.dux.ru
1. Какая версия MySQL?
2. Если выше 4 то попробуй подзапросами...
что типа этого:
SELECT pupils.ID, message, status, touserID, fromuserID, firstname
FROM pupils, mess
WHERE (ID=touserID and fromuserID=1) or (ID=fromuserID and touserID=1)
AND status=(SELECT MAX(status) FROM mess WHERE mess.ID=pupils.ID)
group by pupils.ID
запрос не дебажил....
order by mess.status desc, mess.ID desc;
-
у меня 3.3 с чемто. Но твой запрос, если его правильно написать, получается что два раза одно и тоже выбирает из общирной таблицы сообщений. тогда лучше сделать выборку два раза, может быть
-
MySQL 3.23.53-max если точно
-
Ну что перевелись богатыри на земле русской? никто мне помочь не может?
Тодая сам помог себе, но через задницу конечно. Кому интересно вот такая конструкция вышла
SELECT pupils.ID*(-1-status) as xxx, pupils.ID, message, status, touserID, fromuserID, firstname
FROM pupils, mess
WHERE ( pupils.ID = touserID AND fromuserID =1 ) OR ( pupils.ID = fromuserID AND touserID =1 )
GROUP BY xxx
она выбирает почти как надо, но выходят двойные записи у юзеров у которых есть новые сообщения и старые. Новых ясно, обычно не так много, потому не в 2 раза. но двойные все же попадаются.
Приходится их вычищать потом в WHILE
поясню с pupils.ID*(-1-status). правильнее это выглядит как pupils.ID*(-(1+status)) но меньше скобок мне больше нравится.
1+status - избавляюсь от нуля (status может быть либо 0 либо 1)
-(1+status) ну а минус, так что xxx desc не делать. где то прочитал что любая доп сортировка здорово прибавляет нагрузки.
Но проблема актуальна и если кто может мне помочь - буду рад и признателен.
Заодно возмущен бездарностью MySQL. такие класные функции как unique и distinct не пашут
А с ними проблема решается моментально. А group by годится для примитивных задач. :(