Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Хочу оптимизировать свои запросы и пока не знаю как.
Приведу задачу упрощенно, чтобы сильно не грузить, а только передать суть.
Имеется таблица 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 запрос, что очень не рационально.
Спасибо, если кто-нибудь сможет помочь.
Неактивен
1. Не рационально обрабатывать все данные на PHP
2. idreffer - бесполезное поле. Куда полезнее было бы без него и primary key на (idarticle, idtag)
3.
Неактивен
paulus написал:
1. Не рационально обрабатывать все данные на PHP
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) Поэтому и обратился за помощью, чтобы узнать в какую сторону копать дальше самому
2) Насчет idreffer согласен, я его случайно написал В бд его нет. А почему не нужны primary key у idarticle и idtag? Они кстати Auto increment. Я часто делаю по этим полям выборки.
3) Спасибо большое! Суть понял, завтра на работе попробую проверить.
Неактивен
Я не говорил, что не нужны. Я говорил, что нужен ключ на двух полях - будет и уникальность, и скорость поиска.
Неактивен
Попробовал применить 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.
Пожалуйста, подскажи хоть в чем может быть дело Премного благодарен за твои ответы.
Отредактированно kotofeich (15.01.2009 14:28:55)
Неактивен
Все разобрался Тема закрыта.
Неактивен