SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.01.2009 16:24:19

kotofeich
Участник
Зарегистрирован: 08.08.2008
Сообщений: 10

Объединение нескольких запросов в один.

Здравствуйте.
Хочу оптимизировать свои запросы и пока не знаю как.
Приведу задачу упрощенно, чтобы сильно не грузить, а только передать суть.
Имеется таблица 1 content в которой хранятся статьи
`idarticle` int(11) primary key,
`title` varchar(50),
`introtext` text.

Вторая таблица tags в ней хранятся теги
`id` int(11) primary key,
  `tagname` varchar(35)

И третья таблица tags_reffer для связи статей с тегами
`idreffer` int(11) primary key, 
`idarticle` int(11),
`idtag` int(11).

Вопрос такой: можно ли в один sql-запрос получить все статьи с их тегами, в таком виде, чтобы их потом можно было легко обработать на php?

На данный момент я сначала загружаю все статьи, а потом для каждой статьи отдельно гружу ее теги. В итоге для 20 статей получается 21 запрос, что очень не рационально.
Спасибо, если кто-нибудь сможет помочь.

Неактивен

 

#2 14.01.2009 16:45:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Объединение нескольких запросов в один.

1. Не рационально обрабатывать все данные на PHP  smile
2. idreffer - бесполезное поле. Куда полезнее было бы без него и primary key на (idarticle, idtag)
3.

SELECT c.*, GROUP_CONCAT (t.tagname)
FROM content c
JOIN tags_reffer tr ON USING (idarticle)
JOIN tags t ON t.id = tr.idtag
GROUP BY c.idarticle

Неактивен

 

#3 14.01.2009 16:58:23

kotofeich
Участник
Зарегистрирован: 08.08.2008
Сообщений: 10

Re: Объединение нескольких запросов в один.

paulus написал:

1. Не рационально обрабатывать все данные на PHP  smile
2. idreffer - бесполезное поле. Куда полезнее было бы без него и primary key на (idarticle, idtag)
3.

SELECT c.*, GROUP_CONCAT (t.tagname)
FROM content c
JOIN tags_reffer tr ON USING (idarticle)
JOIN tags t ON t.id = tr.idtag
GROUP BY c.idarticle

1) Поэтому и обратился за помощью, чтобы узнать в какую сторону копать дальше самомуsmile
2) Насчет idreffer согласен, я его случайно написалsmile В бд его нет. А почему не нужны primary key у idarticle и idtag? Они кстати Auto increment. Я часто делаю по этим полям выборки.
3) Спасибо большое! Суть понял, завтра на работе попробую проверить.

Неактивен

 

#4 14.01.2009 19:23:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Объединение нескольких запросов в один.

Я не говорил, что не нужны. Я говорил, что нужен ключ на двух полях - будет и уникальность, и скорость поиска.

Неактивен

 

#5 15.01.2009 14:20:54

kotofeich
Участник
Зарегистрирован: 08.08.2008
Сообщений: 10

Re: Объединение нескольких запросов в один.

Попробовал применить GROUP_CONCAT. В целом у меня получился такой огромный запрос...


SELECT c. * , u.username, u.name, u.id AS userid, iu.avatar, ic.community_keyword, ic.avatar AS community_avatar,
 ic.id_community, ic.who_write, ic.title AS community_title, count( icom.id ) AS comments, GROUP_CONCAT( t.tagname )
FROM
#__idoblog_content as c,
#__users as u,
#__idoblog_communities as ic,
#__idoblog_users as iu
JOIN
#__idoblog_tags_reffer as tr
ON USING (c.id)
JOIN #__idoblog_tags as t
ON t.id = tr.idtag
LEFT JOIN
#__idoblog_comments as icom
ON
icom. idarticle=c.id
WHERE
c.state=1 AND c.created_by=u.id AND ic.id_community=c.idcommunity AND u.id=iu.iduser AND c.karma>=0 AND iu.rating>=0
GROUP BY c.id
ORDER BY created desc
LIMIT 0, 20
 

Мне выдает такую ошибку
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2.
Без использования GROUP_CONCAT и JOIN запрос работает.
Помоги, если есть возможность, разобраться.

Суть всего этого запроса: я получаю посты из блога, число комментариев (через LEFT JOIN), и вот теперь хочу теги через GROUP_CONCAT и JOIN.
Тестирую на MySQL 4.1.16.
Пожалуйста, подскажи хоть в чем может быть делоsmile Премного благодарен за твои ответы.

Отредактированно kotofeich (15.01.2009 14:28:55)

Неактивен

 

#6 15.01.2009 15:56:39

kotofeich
Участник
Зарегистрирован: 08.08.2008
Сообщений: 10

Re: Объединение нескольких запросов в один.

Все разобралсяsmile Тема закрыта.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson