2

I am trying to create SEO friendly URLs using the below tables:

Category table

category

Pages table

pages table

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:

expected

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

4
  • 1
    Have you checked out any database recursion? this looks like an exercise on recursion... just sayin' Commented Nov 29, 2013 at 9:14
  • @hanzo2001 this is for cms Commented Nov 29, 2013 at 9:26
  • @mahavir-munot, I believe that you can't do that for arbitrary URL depth without creating stored procedure (which would call itself recursively). Commented Nov 29, 2013 at 9:35
  • Things like this have been asked before: stack overflow. You should do some more research before attempting to do this Commented Nov 29, 2013 at 9:35

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

0

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

6 Comments

yes, because there are only, 3 Joins, you could add more joins, but like i said, its not the best solution
Everyone should go check out another stackoverflow question
@hanzo2001 I can use the left - right approach but I want to see if there is any other approach
here's the thing, you want to generate a hierarchical structure through a flat (linear) data table. I'm sorry to say this but the best (and complete) approach is through recursion. The other way is through the Adjacency List Model a la @lgoel style
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.