3 таблицы - 1 (?) select. помогите составить запрос

toxic steel

Новичок
3 таблицы - 1 (?) select. помогите составить запрос

мозг пухнет от join-ов, union-ов, group-ов и иже с ними, чую чем больше буду мануал курить-тем хуже только, надо "отдышаться" помогите на примере, пожалуйста:

1 таблица: "публикации", условно 2 поля- IDp и Text
2 таблица: "разделы", условно 2 поля- IDr и Name
3 таблица: "публикации в разделах", 3 поля: собственно pINr, IDp IDr

публикация может находиться в нескольких разделах, или вообще не находиться ни в каком.

надо вывести на страницу:

текст публикации-1 [имя раздела-1, имя раздела-78, имя раздела-96]
текст публикации-2 [имя раздела-12, имя раздела-78]
текст публикации-3 []
текст публикации-4 [имя раздела-65]
текст публикации-5 []
...
ну и так далее...

как организовать это минимально-ресурсоёмким способом?

спасибо огромное заранее.
 

zerkms

TDD infected
Команда форума
выбрать всё из таблы 1, объединив с таблой 2 через таблу 3
оба объединения - LEFT JOIN
 

toxic steel

Новичок
неа, у меня вывод тогда таким получается:

текст публикации-1 [имя раздела-1]
текст публикации-1 [имя раздела-78]
текст публикации-1 [имя раздела-96]
текст публикации-2 [имя раздела-12]
текст публикации-2 [имя раздела-78]
текст публикации-3 []
текст публикации-4 [имя раздела-65]
текст публикации-5 []
...
ну и так далее...
 

toxic steel

Новичок
PHP:
SELECT * FROM публикации

    LEFT JOIN публикации _в_разделах ON публикации.IDp  = публикации_в_разделах.IDp
    LEFT JOIN разделы  ON публикации_в_разделах.IDr = разделы.IDr
    WHERE   публикации.некий_параметр = $входящая_переменная

ORDER BY IDp DESC LIMIT 0, 10
 

zerkms

TDD infected
Команда форума
и правильно получаются
группируй уже в коде, если лень - GROUP_CONCAT() + GROUP BY
 

toxic steel

Новичок
Автор оригинала: zerkms
GROUP_CONCAT()
ой-ой-ой, похоже вот то, что мне нужно! премного благодарен за наводку.
просто в книгах как-то либо груп, либо конкат, а груп_конкат небыло, чесслово :)

*печально вздохнув - опять мануалы, си их бемоль...

-~{}~ 01.12.08 10:42:

вот что в итоге получилось:

SELECT публикации.*, GROUP_CONCAT(разделы.IDr, '--', разделы.Name) AS псевдоним FROM публикации
LEFT JOIN публикации_в_разделах ON публикации.IDp= публикации_в_разделах.IDp
LEFT JOIN разделы ON разделы.IDr= публикации_в_разделах.IDr

WHERE публикации.некий_параметр = $входящая_переменная
GROUP BY публикации.IDp
ORDER BY публикации.IDp DESC LIMIT 0, 10

можно ли это класть на сервер? и вообще людям показывать? :)

в среднем у меня на машине (3,06ггц/3гб/куча всякой пежни фоном запущено) запрос (только выбор, без вывода) генерируется за 0.01 сек. при мизерном количестве строк...
 
Сверху