Last active
March 27, 2020 11:36
-
-
Save Korol/00fc78ea6f79f6e54291f595bebd6ebb to your computer and use it in GitHub Desktop.
Getting all parent rows in one SQL query (FOR BREADCRUMBS) http://stackoverflow.com/questions/2441821/getting-all-parent-rows-in-one-sql-query
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| QUESTION: | |
| I have a simple MySQL table thats contains a list of categories, level is determined by parent_id: | |
| id name parent_id | |
| --------------------------- | |
| 1 Home 0 | |
| 2 About 1 | |
| 3 Contact 1 | |
| 4 Legal 2 | |
| 5 Privacy 4 | |
| 6 Products 1 | |
| 7 Support 1 | |
| I'm attempting to make a breadcrumb trail. So i have the 'id' of the child, I want to get all available parents (iterating up the chain until we reach 0 "Home"). There could be any number or child rows going to an unlimited depth. | |
| Currently I am using an SQL call for each parent, this is messy. Is there a way in SQL to do this all on one query? | |
| ANSWER: | |
| Adapted from here: https://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/ | |
| For category "Privacy" (id=5): | |
| ---- | |
| SELECT T2.id, T2.name | |
| FROM ( | |
| SELECT | |
| @r AS _id, | |
| (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id, | |
| @l := @l + 1 AS lvl | |
| FROM | |
| (SELECT @r := 5, @l := 0) vars, | |
| table1 h | |
| WHERE @r <> 0) T1 | |
| JOIN table1 T2 | |
| ON T1._id = T2.id | |
| ORDER BY T1.lvl DESC | |
| ---- | |
| The line @r := 5 is the ID for the current category. | |
| The result is as follows: | |
| ---- | |
| 1, 'Home' | |
| 2, 'About' | |
| 4, 'Legal' | |
| 5, 'Privacy' | |
| FOR MY TASK: | |
| SELECT T2.id, T2.title | |
| FROM ( | |
| SELECT | |
| @r AS _id, | |
| (SELECT @r := parent_id FROM categories WHERE id = _id) AS parent_id, | |
| @l := @l + 1 AS lvl | |
| FROM | |
| (SELECT @r := 87, @l := 0) vars, | |
| categories h | |
| WHERE @r <> 0) T1 | |
| JOIN categories T2 | |
| ON T1._id = T2.id | |
| ORDER BY T1.lvl DESC; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello, this works perfect. But i need a little advise:
i have 2 tables
1: pages
2: pages_text
So i need to get full chain with pages.url and pages_text.name where languages_id = 2
Can u help me? Thank you.