Попытка оптимизации INNER JOIN

facelift

Новичок
Попытка оптимизации INNER JOIN

Здравствуйте. Есть три таблички. Первые две содержат данные, третья - это таблица пересечения. Т.е. в третьей два столбца, в первом ключи первой таблицы, во втором ключи второй таблицы. Могу подробнее

[sql]
CREATE TABLE `messages` (
`id` int(11) unsigned NOT NULL auto_increment,
`message` text,
PRIMARY KEY (`id`)
);


CREATE TABLE `tags` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` text character set latin1,
PRIMARY KEY (`id`)
);


CREATE TABLE `joints` (
`tag_id` int(11) default NULL,
`message_id` int(11) default NULL
);
[/sql]

Теперь мы делаем запрос с двумя join'ами
[sql]
SELECT messages.message, temp.name FROM messages INNER JOIN (SELECT tags.name, joints.message_id FROM tags INNER JOIN joints ON tags.id = joints.tag_id) as temp ON messages.id = temp.message_id
[/sql]

И получаем ответ, в котором текст сообщения дублируется для каждого тега.

Можно ли составить один запрос который бы тянул из базы все сразу? Сразу и сообщения и теги, и при этом ничего не дублировал? И, если можно его составить, как его обрабатывать в php?
 

Beavis

Banned
ты какой то кривой запрос написал...))

сначала делай выборку из связующей таблицы, а потом попробуй с помощью INNER JOIN прицепить к ней данные сначала из первой таблицы, а потом и из второй...

и вообще попытайся понять как JOIN работает, а не наобум пиши)
 

Gas

может по одной?
Для сообщения может быть несколько тегов.
это никак не влияет на то, что написал Beavis, тебе не нужен тут derived-query, а просто сделай join 3-х таблиц.
 

facelift

Новичок
Gas
А что мне вернет такой запрос? И как потом его обработать в PHP?
 

Beavis

Banned
facelift
я понимаю.. ну получится на каждое сообщение несколько строк

-~{}~ 18.06.09 18:04:

facelift
вернет все связи сообщений с тегами

обработать его - также как и другие результаты запросов.. с помощью функций для работы с БД
 

Gas

может по одной?
я согласен с Beavis
ну ещё в mysql есть функция group_concat, главное помнить об ограничени group_concat_max_len и увеличить размер при необходимости.
 

facelift

Новичок
Beavis
У меня получилось так

Message1 Tag1
Message1 Tag2
Message1 Tag4
Message3 Tag2
Message3 Tag4
Message3 Tag6

Вот тут дублируется текст сообщения. Можно ли этого как-то избежать и чтобы запрос остался один?

-~{}~ 18.06.09 18:17:

Gas
Как раз ее смотрю
 

Beavis

Banned
facelift
ну а как ты хочешь, это же таблица...
если будешь использовать group_concat получится

Message1 Tag1,Tag2,Tag4
Message3 Tag2,Tag4,Tag6

и поиск по тегам будет затруднен...
 

facelift

Новичок
Beavis
Ага, т.е. получается что сделать иначе нельзя?

-~{}~ 18.06.09 18:35:

Ладно, всем спасибо.
 
Сверху