Как сформировать запрос для нескольких таблиц без повторов выводимых данных?
Так как запросы из бд возвращают построковые данные, ни о каких вложенных массивах речи быть не может. Единственный вариант - хранить в поле json, который, уже после получения, средствами языка получать как массив/объект. Или как написал oxidmod - конкатенацией групп, получим строку вместо json, но хранение будет более нормализованным.
Да, группировка самый простой способ, другие варианты всяко прожорливее.
И кстати группировку при больших объемах можно и нужно делать не в MySQL, а в php - т.е. одним простым и быстрым запросом вытягиваешь ВСЁ в массив, далее в массиве спокойно группируешь и выводишь - тут будут использоваться уже ресурсы процессора, так разумнее, ведь редко нужно предоставлять требуемый тебе результат в течение 1 микросекунды, у тебя же не биржа с биткойнами, ну а за 1 миллисекунду любой процессор разложит массив по полочкам. будь в нем хоть миллион строк, пишу, потому что делал так, это не из гугла!!))