Автор Тема: Проблема с выбором уникальных полей, но сортированных по определенному принципу  (Прочитано 3811 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн a@mail.dux.ru

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 105
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Проблема с выбором уникальных полей, но сортированных по определенному принципу.
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

А по боевому, все ж НЕ так как надо.
Так что проблема актуальна. Прошу помощи.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
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;
And no religion too...

Оффлайн a@mail.dux.ru

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 105
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
у меня 3.3 с чемто. Но твой запрос, если его правильно написать, получается что два раза одно и тоже выбирает из общирной таблицы сообщений. тогда лучше сделать выборку два раза, может быть

Оффлайн a@mail.dux.ru

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 105
  • +0/-0
  • 0
    • Просмотр профиля
    • http://

Оффлайн a@mail.dux.ru

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 105
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Ну что перевелись богатыри на земле русской? никто мне помочь не может?

Тодая сам помог себе, но через задницу конечно. Кому интересно вот такая конструкция вышла

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 годится для примитивных задач. :(

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28