Список категорий с парентами:
SELECT c.category_id, c.category_url, cref.category_parent_id FROM jos_vm_category AS c, jos_vm_category_xref AS cref WHERE c.category_id = cref.category_child_id ORDER BY c.category_id
Список товаров с категориями:
SELECT p.product_id, p.product_url, p.product_sku, c.category_id FROM jos_vm_product AS p, jos_vm_product_category_xref AS c WHERE IF( p.product_parent_id >0, p.product_parent_id, p.product_id ) = c.product_id ORDER BY p.product_id
запрос сам по себе отличный, но если товар входит в две или более категорий, то соответственно в списке он будет два или более раз. Для того, чтобы товар можно было однозначно идентифицировать по категории, можно ввести понятие базовой категории с минимальным ID и создать соответствующий VIEW:
CREATE VIEW `vms_categorized_product` AS select `p`.`product_id` AS `product_id`,`c`.`category_id` AS `category_id`,`c`.`category_name` AS `category_name`,`p`.`product_name` AS `product_name`,`p`.`product_url` AS `product_url`,`c`.`category_url` AS `category_url`,`p`.`product_thumb_image` AS `product_thumb_image` from ((`jos_vm_product` `p` join `jos_vm_category` `c`) join `vms_basic_category` `x`) where ((`x`.`category_id` = `c`.`category_id`) and (`x`.`product_id` = `p`.`product_id`)) order by `c`.`category_id`,`p`.`product_name`;
а потом заменить в нашем запросе jos_vm_product_category_xref на vms_categorized_product.