Помогите составить запрос
В таком виде, как нужно вывести – нельзя. Можно сделать два JOIN'а, вытянуть все данные (опционально отфильтрованные по кодам категорий и товаров), а потом через foreach сформировать массив с нужной структурой (или, если выборка с сортировкой, сразу выводить, вставив внутрь foreach нужные if'ы).
Но в случае больших объёмов данных нужно искать середину между количеством запросов и количеством данных за один запрос. Например, вытянуть категории и в цикле для каждой вытаскивать товары с вариантами.
Вопрос задавал перед уходом и немного напутал структуру. Там есть еще 1 таблица, из-за чего у 2 из 3 таблиц из вопроса в запросе join к этой 4-ой таблице.

За пример взял запрос truekenny, и перебрав несколько вариантов, получил то что надо. 
В оригинале у меня есть еще группировка, а в получившемся запросе обошелся без неё, только сортировка.

Время выполнения обоих вариантов примерно одинаково. Надо попробовать еще вариант, который написал UZER2006 в последнем предложении.
В общем протестирую еще немного и переберу варианты.

sevka_fedoroff, join'ы составлять умею, а с остальным не сталкивался

Спасибо всем кто помог