|
|
|
| Существует таблица:
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»’ом. Что можно придумать в этой ситуёвине, кроме как создать еще одну таблицу для контакт-листа?
Спасибо. | |
|
|
|
|
|
|
|
для: 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.... да и база была другая... а в мускуле тока начинаю в синтаксисе и возможностях разбираться | |
|
|
|
|
|
|
|
для: 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'
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.02.2007 в 10:34)
| | >поражает своей э... незатейливостью.
Кто-то тут недавно в соседней ветке ругал меня за большое количество лишнего кода? Упрощаем-с. Кроме того, в условиях этой задачки я заранее указал, что UNION использовать нельзя:) | |
|
|
|
|
|
|
|
для: babilonian
(13.02.2007 в 15:17)
| | >Кто-то тут недавно в соседней ветке ругал меня за большое количество лишнего кода?
Я чтоли? Я вообще никого не ругаю ))
Просто мне, например, как-то непривычно, когда список людей писавших мне/получавших от меня сообщения автоматически будут считать моей адресной книгой. Адресная книга это то, что я формирую сам. А не то, что складывается спонтанно. И уж количество кода тут совсем не при делах. Я не код критиковал, а сам подход к проблеме.
>Кроме того, в условиях этой задачки я заранее указал, что UNION использовать нельзя:)
По какой причине? | |
|
|
|
|
|
|
|
для: Trianon
(13.02.2007 в 15:33)
| | >Адресная книга это то, что я формирую сам
Здесь задача другая. Контакт лист должен формироваться именно исходя из истории переписки.
>По какой причине?
По причине непродвинутости хостера и старой СУБД. | |
|
|
|
|
|
|
|
для: babilonian
(13.02.2007 в 15:45)
| | UNION отсутствует только в MySQL 3.* . Это, как бы сказать, даже для хостинга версия откровенно старая - там очень много чего не реализовано. И об этом стоило предупредить.
Сомневаюсь, что на такой базе эту задачу можно решить чистым SQL.
А значит придется решать средствами php. | |
|
|
|
|
|
|
|
для: Trianon
(13.02.2007 в 16:12)
| | Если это окончательно и обжалованию не подлежит, тогда спасибо. Сомнения в адекватности хостера полностью развеялись:( | |
|
|
|