I am trying to create SEO friendly URLs using the below tables:
Category table
![](https://www.manongdao.com/static/images/pcload.jpg)
Pages table
![](https://www.manongdao.com/static/images/pcload.jpg)
I am trying to write a mysql query that will generate URLs for all the pages in the pages table using the category table producing the below output.
Expected Ouput:
![](https://www.manongdao.com/static/images/pcload.jpg)
Here is the MySql query that I tried for generating URLs upto 4 segments:
SELECT pg.id AS page_id, p3.id, p1.category AS segment1, p2.category AS segment2, p3.category AS segment3,
pg.page_name AS PAGE , concat( '/', p1.category, '/', p2.category, '/', p3.category, '/', pg.page_name, '/' ) AS url
FROM category AS p1, category AS p2, category AS p3, pages AS pg
WHERE pg.category_id = p3.id
AND p3.parent_id = p2.id
AND p2.parent_id = p1.id
Link to SQL Fiddle
Here is the answer to my own question:
I tried using the "MySql Modified preorder tree to create url" method which I find more useful in terms of query optimization and other research through stackoverflow.
Not the best solution, but it works ;)
SELECT pagetable.id AS page_id
, c1.id
, pagetable.page_name AS PAGE
, concat(
IF(c3.category IS NULL,'','/')
, IF(c3.category IS NULL,'',c3.category)
, IF(c2.category IS NULL,'','/')
, IF(c2.category IS NULL,'',c2.category)
, IF(c1.category IS NULL,'','/')
, IF(c1.category IS NULL,'',c1.category)
, '/'
, pagetable.page_name
, '/' ) AS url
FROM pages AS pagetable
LEFT JOIN category AS c1
ON pagetable.category_id = c1.id
LEFT JOIN category AS c2
ON c1.parent_id = c2.id
LEFT JOIN category AS c3
ON c2.parent_id = c3.id