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

Форум MySQL

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

 

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

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

тема: Группировка значений – это неразрешимо?
 
 автор: babilonian   (13.02.2007 в 05:32)   письмо автору
 
 

Существует таблица:

CREATE TABLE `post` (
  `id` int(11) NOT NULL auto_increment,
  `sender` varchar(150) NOT NULL default '',
  `address` varchar(150) NOT NULL default '',
  `text` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;


В полях sender и address находятся имена переписывающихся пользователей. В поле текст, содержание переписки, id – уникальный идентификатор записи. Требуется сделать вывод списка контактов из этой таблицы. Проблема в том, что в полях `sender` и `address` таблицы, имеются повторяющиеся значения. То есть, если Саша пишет Маше, запись получается в виде

INSERT INTO `post` VALUES (1, 'sasha', 'masha', 'Привет Маша!');

а, если Маша Саше:

INSERT INTO `post` VALUES (2, 'masha', ' sasha', 'Привет Саша!');

Так вот, каким образом, можно сделать группировку по полям `sender` и `address` и можно ли сделать вообще, если, допустим, есть еще записи

INSERT INTO `post` VALUES (3, 'masha', ' kolya', 'Привет Коля!');
INSERT INTO `post` VALUES (4, 'masha', ' vasya', 'Привет Вася!');

На выходе требуется получить контакт лист, допустим, для Маши в виде: “sasha, kolya, vasya“. Как это сделать, не выходя за рамки одной таблицы, в мою голову что-то не приходит. Ибо, группировать как:

SELECT * FROM post  
WHERE `sender`='masha' OR `address`='masha'
GROUP BY `sender ` AND `address ` 

не представляется возможным. Впрочем, как и объединять запросы «UNION»’ом. Что можно придумать в этой ситуёвине, кроме как создать еще одну таблицу для контакт-листа?
Спасибо.

   
 
 автор: ZuArt   (13.02.2007 в 10:13)   письмо автору
 
   для: babilonian   (13.02.2007 в 05:32)
 

Возможно, будет не самым простым или корректным вариантом, но с выходом в свет Мускула 5 стоит посмотреть в сторону хранимых процедур... В самой процедуре можно реализовать алгоритм формирования КАЖДОЙ выходной строки... а в самой процедуре можно просто реализовать два "цикла" с вложением... (синтаксис не помню точно - пишу только олгоритм)

function AddrBook()
select distinct sender from post
for
$snd = sender
$addr = ""
select distinct address from post where sender = $snd
for
$addr = $addr + "," + address
next
out = ($snd, $addr)
next

запрос для получения данных быдет типа select * from AddrBook()

Что-то типа этого... давно просто с хранимками не работал - лет эдак 5.... да и база была другая... а в мускуле тока начинаю в синтаксисе и возможностях разбираться

   
 
 автор: Trianon   (13.02.2007 в 10:34)   письмо автору
 
   для: babilonian   (13.02.2007 в 05:32)
 

методика построения контактов слегка поражает своей э... незатейливостью.
Но если так хочется?



  SELECT sender AS contact FROM post WHERE address = 'masha'
UNION
  SELECT address AS contact FROM post WHERE sender = 'masha' 

   
 
 автор: babilonian   (13.02.2007 в 15:17)   письмо автору
 
   для: Trianon   (13.02.2007 в 10:34)
 

>поражает своей э... незатейливостью.
Кто-то тут недавно в соседней ветке ругал меня за большое количество лишнего кода? Упрощаем-с. Кроме того, в условиях этой задачки я заранее указал, что UNION использовать нельзя:)

   
 
 автор: Trianon   (13.02.2007 в 15:33)   письмо автору
 
   для: babilonian   (13.02.2007 в 15:17)
 

>Кто-то тут недавно в соседней ветке ругал меня за большое количество лишнего кода?

Я чтоли? Я вообще никого не ругаю ))

Просто мне, например, как-то непривычно, когда список людей писавших мне/получавших от меня сообщения автоматически будут считать моей адресной книгой. Адресная книга это то, что я формирую сам. А не то, что складывается спонтанно. И уж количество кода тут совсем не при делах. Я не код критиковал, а сам подход к проблеме.

>Кроме того, в условиях этой задачки я заранее указал, что UNION использовать нельзя:)

По какой причине?

   
 
 автор: babilonian   (13.02.2007 в 15:45)   письмо автору
 
   для: Trianon   (13.02.2007 в 15:33)
 

>Адресная книга это то, что я формирую сам
Здесь задача другая. Контакт лист должен формироваться именно исходя из истории переписки.
>По какой причине?
По причине непродвинутости хостера и старой СУБД.

   
 
 автор: Trianon   (13.02.2007 в 16:12)   письмо автору
 
   для: babilonian   (13.02.2007 в 15:45)
 

UNION отсутствует только в MySQL 3.* . Это, как бы сказать, даже для хостинга версия откровенно старая - там очень много чего не реализовано. И об этом стоило предупредить.
Сомневаюсь, что на такой базе эту задачу можно решить чистым SQL.
А значит придется решать средствами php.

   
 
 автор: babilonian   (14.02.2007 в 00:24)   письмо автору
 
   для: Trianon   (13.02.2007 в 16:12)
 

Если это окончательно и обжалованию не подлежит, тогда спасибо. Сомнения в адекватности хостера полностью развеялись:(

   
Rambler's Top100
вверх

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