PageSourceSearch

https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

html mikehillyer.com collected 2026-10-02 05:06:03 UTC 314,351 bytes, 3,933 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-US">
3<head>
4	<meta charset="UTF-8" />
5	<meta name="viewport" content="width=device-width, initial-scale=1" />
6<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
7
8	<!-- This site is optimized with the Yoast SEO plugin v28.6 - https://yoast.com/product/yoast-seo-wordpress/ -->
9	<link rel="canonical" href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" />
10	<meta property="og:locale" content="en_US" />
11	<meta property="og:type" content="article" />
12	<meta property="og:title" content="Managing Hierarchical Data in MySQL &#8212; Mike Hillyer&#039;s Personal Webspace" />
13	<meta property="og:description" content="Introduction Most users at one time or another have dealt with hierarchical data in a SQL database and no doubt learned that the management of hierarchical data is not what a relational database is intended for. The tables of a relational database are not hierarchical (like XML), but are simply a flat list. Hierarchical data [&hellip;]" />
14	<meta property="og:url" content="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" />
15	<meta property="og:site_name" content="Mike Hillyer&#039;s Personal Webspace" />
16	<meta property="article:modified_time" content="2019-02-06T15:02:50+00:00" />
17	<meta property="og:image" content="http://mikehillyer.com/media//categories.png" />
18	<meta name="twitter:card" content="summary_large_image" />
19	<meta name="twitter:label1" content="Est. reading time" />
20	<meta name="twitter:data1" content="19 minutes" />
21	
21<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/","url":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/","name":"Managing Hierarchical Data in MySQL &#8212; Mike Hillyer&#039;s Personal Webspace","isPartOf":{"@id":"https:\/\/mikehillyer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/#primaryimage"},"image":{"@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/#primaryimage"},"thumbnailUrl":"http:\/\/mikehillyer.com\/media\/\/categories.png","datePublished":"2010-05-17T21:08:11+00:00","dateModified":"2019-02-06T15:02:50+00:00","breadcrumb":{"@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/#primaryimage","url":"https:\/\/mikehillyer.com\/media\/\/categories.png","contentUrl":"https:\/\/mikehillyer.com\/media\/\/categories.png","width":"830","height":"452"},{"@type":"BreadcrumbList","@id":"https:\/\/mikehillyer.com\/articles\/managing-hierarchical-data-in-mysql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/mikehillyer.com\/"},{"@type":"ListItem","position":2,"name":"Popular Posts","item":"https:\/\/mikehillyer.com\/articles\/"},{"@type":"ListItem","position":3,"name":"Managing Hierarchical Data in MySQL"}]},{"@type":"WebSite","@id":"https:\/\/mikehillyer.com\/#website","url":"https:\/\/mikehillyer.com\/","name":"Mike Hillyer&#039;s Personal Webspace","description":"","publisher":{"@id":"https:\/\/mikehillyer.com\/#\/schema\/person\/2295d31127656f327f3d762d373b6599"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mikehillyer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/mikehillyer.com\/#\/schema\/person\/2295d31127656f327f3d762d373b6599","name":"Mike Hillyer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b0ce27b5f08bd3e076e16ce88f8010eb029ff94f8125248587b9fb2c0be0c39a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b0ce27b5f08bd3e076e16ce88f8010eb029ff94f8125248587b9fb2c0be0c39a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b0ce27b5f08bd3e076e16ce88f8010eb029ff94f8125248587b9fb2c0be0c39a?s=96&d=mm&r=g","caption":"Mike Hillyer"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/b0ce27b5f08bd3e076e16ce88f8010eb029ff94f8125248587b9fb2c0be0c39a?s=96&d=mm&r=g"},"sameAs":["http:\/\/mikehillyer.com"]}]}</script>
21
22	<!-- / Yoast SEO plugin. -->
23
24
25<title>Managing Hierarchical Data in MySQL &#8212; Mike Hillyer&#039;s Personal Webspace</title>
26<link rel='dns-prefetch' href='//www.googletagmanager.com' />
27<link rel="alternate" type="application/rss+xml" title="Mike Hillyer&#039;s Personal Webspace &raquo; Feed" href="https://mikehillyer.com/feed/" />
28<link rel="alternate" type="application/rss+xml" title="Mike Hillyer&#039;s Personal Webspace &raquo; Comments Feed" href="https://mikehillyer.com/comments/feed/" />
29<link rel="alternate" type="application/rss+xml" title="Mike Hillyer&#039;s Personal Webspace &raquo; Managing Hierarchical Data in MySQL Comments Feed" href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/feed/" />
30<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://mikehillyer.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmikehillyer.com%2Farticles%2Fmanaging-hierarchical-data-in-mysql%2F" />
31<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://mikehillyer.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmikehillyer.com%2Farticles%2Fmanaging-hierarchical-data-in-mysql%2F&#038;format=xml" />
32<style id="wp-img-auto-sizes-contain-inline-css">
33img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
34/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
35</style>
36<style id="wp-block-site-title-inline-css">
37.wp-block-site-title{box-sizing:border-box}.wp-block-site-title :where(a){color:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}
38/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/site-title/style.min.css */
39</style>
40<style id="wp-block-navigation-link-inline-css">
41.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}.link-ui-tools{outline:1px solid #f0f0f0;padding:8px}.link-ui-block-inserter{padding-top:8px}.link-ui-block-inserter__back{margin-left:8px;text-transform:uppercase}
42/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/navigation-link/style.min.css */
43</style>
44<style id="wp-block-navigation-inline-css">
45.wp-block-navigation{position:relative}.wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block;z-index:1}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation :where(a),.wp-block-navigation :where(a:active),.wp-block-navigation :where(a:focus){text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-left:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{stroke:currentColor;display:inline-block;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation{--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}:where(.wp-block-navigation) ul li{padding:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;opacity:0;position:absolute;z-index:2}@media not (prefers-reduced-motion){.wp-block-navigation .has-child .wp-block-navigation__submenu-container{transition:opacity .1s linear}}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{height:0;overflow:hidden;visibility:hidden;width:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1;padding:.5em 1em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:auto;margin-right:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{left:-1px;top:100%}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:transparent;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-right:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(-90deg)}}@media (hover:hover){.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{height:auto;
45min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container,.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child.open-always{align-items:var(--navigation-layout-align,initial);flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);gap:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always,.wp-block-navigation .has-child.open-always .wp-block-navigation-item{justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container,.wp-block-navigation .has-child.open-always.wp-block-navigation-submenu{gap:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always .wp-block-navigation-item,.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container,.wp-block-navigation .has-child.open-always.wp-block-navigation-submenu{padding-bottom:0;padding-top:0}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container{padding-left:var(--wp--style--block-gap,2em);padding-right:var(--wp--style--block-gap,2em)}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container .wp-block-navigation-item__content{padding:0}.wp-block-navigation .has-child.open-always .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content,.wp-block-navigation .has-child.open-always>.wp-block-navigation-item__content{flex-grow:0}.wp-block-navigation .has-child.open-always>.wp-block-navigation__submenu-container{background-color:transparent;border:none;color:inherit;flex-basis:100%;height:auto;opacity:1;overflow:visible;position:static;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{left:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:transparent;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-align:left;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-submenu__toggle[aria-expanded=true]+.wp-block-navigation__submenu-icon>svg,.wp-block-navigation-submenu__toggle[aria-expanded=true]>svg{transform:rotate(180deg)}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:0;padding-right:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-left:-.6em;pointer-events:none}.wp-block-navigation-item.open-on-click button.wp-block-navigation-item__content:not(.wp-block-navigation-submenu__toggle){padding:0}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:auto;right:0}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:auto;right:100%}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid rgba(0,0,0,.15)}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{c
45olor:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-left:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{background-color:inherit;display:flex;flex-direction:column}@media not (prefers-reduced-motion){.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards}}.wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-left),20rem)}.wp-block-navigation__responsive-container.is-menu-open{overflow:auto;z-index:100000}.wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay) .wp-block-navigation__responsive-container-content{padding-top:calc(2rem 
45+ 24px)}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;
45min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-page-list{background:transparent!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}.wp-block-navigation__responsive-container.disable-default-overlay .wp-block-navigation__overlay-container{display:none;width:100%}.wp-block-navigation__responsive-container.disable-default-overlay .wp-block-navigation__responsive-close{max-width:none}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content>:not(.wp-block-navigation__overlay-container){display:none}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__overlay-container{display:block}.wp-block-navigation__responsive-container.disable-default-overlay.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__overlay-container .wp-block-navigation__submenu-container{left:0;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay){color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:transparent;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{position:absolute;right:0;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.disable-default-overlay .wp-block-navigation__responsive-container-close{right:clamp(1rem,var(--wp--style--root--padding-left),20rem);top:clamp(1rem,var(--wp--style--root--padding-left),20rem)}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}
45.has-modal-open .admin-bar .is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open:where(:not(.disable-default-overlay)) .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}
46/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/navigation/style.min.css */
47</style>
48<style id="wp-block-group-inline-css">
49.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}
50/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/group/style.min.css */
51</style>
52<style id="wp-block-post-title-inline-css">
53.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title :where(a){display:inline-block;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}
54/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/post-title/style.min.css */
55</style>
56<style id="wp-block-post-content-inline-css">
57.wp-block-post-content{display:flow-root}
58/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/post-content/style.min.css */
59</style>
60<style id="wp-block-heading-inline-css">
61h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
62/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/heading/style.min.css */
63</style>
64<style id="wp-block-avatar-inline-css">
65.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}
66/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/avatar/style.min.css */
67</style>
68<style id="wp-block-comment-author-name-inline-css">
69.wp-block-comment-author-name{box-sizing:border-box}
70/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/comment-author-name/style.min.css */
71</style>
72<style id="wp-block-comment-date-inline-css">
73.wp-block-comment-date{box-sizing:border-box}
74/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/comment-date/style.min.css */
75</style>
76<style id="wp-block-comment-content-inline-css">
77.comment-awaiting-moderation{display:block;font-size:.875em;line-height:1.5}.wp-block-comment-content{box-sizing:border-box}
78/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/comment-content/style.min.css */
79</style>
80<style id="wp-block-columns-inline-css">
81.wp-block-columns{box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns{align-items:normal!important}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
82/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/columns/style.min.css */
83</style>
84<style id="wp-block-comment-template-inline-css">
85.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-left:2rem}.wp-block-comment-template.alignleft{float:left}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:right}
86/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/comment-template/style.min.css */
87</style>
88<style id="wp-block-comments-inline-css">
89.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:left}.wp-block-post-comments .alignright{float:right}
89.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.wp-block-comments{box-sizing:border-box}
90/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/comments/style.min.css */
91</style>
92<style id="wp-block-paragraph-inline-css">
93.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
94/*# sourceURL=https://mikehillyer.com/wordpress/wp-includes/blocks/paragraph/style.min.css */
95</style>
96<style id="wp-emoji-styles-inline-css">
97
98	img.wp-smiley, img.emoji {
99		display: inline !important;
100		border: none !important;
101		box-shadow: none !important;
102		height: 1em !important;
103		width: 1em !important;
104		margin: 0 0.07em !important;
105		vertical-align: -0.1em !important;
106		background: none !important;
107		padding: 0 !important;
108	}
109/*# sourceURL=wp-emoji-styles-inline-css */
110</style>
111<style id="wp-block-library-inline-css">
112:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}
112.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
113/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
114</style>
115<style id="global-styles-inline-css">
116:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--base: #ffffff;--wp--preset--color--contrast: #000000;--wp--preset--color--primary: #9DFF20;--wp--preset--color--secondary: #345C00;--wp--preset--color--tertiary: #F6F6F6;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
1160) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.227), 1rem);--wp--preset--font-size--medium: clamp(1rem, 1rem + ((1vw - 0.2rem) * 0.227), 1.125rem);--wp--preset--font-size--large: clamp(1.75rem, 1.75rem + ((1vw - 0.2rem) * 0.227), 1.875rem);--wp--preset--font-size--x-large: 2.25rem;--wp--preset--font-size--xx-large: clamp(4rem, 4rem + ((1vw - 0.2rem) * 10.909), 10rem);--wp--preset--font-family--dm-sans: "DM Sans", sans-serif;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--inter: "Inter", sans-serif;--wp--preset--font-family--system-font: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--wp--preset--font-family--source-serif-pro: "Source Serif Pro", serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: clamp(1.5rem, 5vw, 2rem);--wp--preset--spacing--40: clamp(1.8rem, 1.8rem + ((1vw - 0.48rem) * 2.885), 3rem);--wp--preset--spacing--50: clamp(2.5rem, 8vw, 4.5rem);--wp--preset--spacing--60: clamp(3.75rem, 10vw, 7rem);--wp--preset--spacing--70: clamp(5rem, 5.25rem + ((1vw - 0.48rem) * 9.096), 8rem);--wp--preset--spacing--80: clamp(7rem, 14vw, 11rem);--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: 650px;--wp--style--global--wide-size: 1200px; }:where(body) { margin: 0; }.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 1.5rem; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 1.5rem; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 1.5rem;}:root :where(.is-layout-grid){gap: 1.5rem;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained >
116 :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{background-color: var(--wp--preset--color--base);color: var(--wp--preset--color--contrast);font-family: var(--wp--preset--font-family--system-font);font-size: var(--wp--preset--font-size--medium);line-height: 1.6;--wp--style--root--padding-top: var(--wp--preset--spacing--40);--wp--style--root--padding-right: var(--wp--preset--spacing--30);--wp--style--root--padding-bottom: var(--wp--preset--spacing--40);--wp--style--root--padding-left: var(--wp--preset--spacing--30);}a:where(:not(.wp-element-button)){color: var(--wp--preset--color--contrast);text-decoration: underline;}:root :where(a:where(:not(.wp-element-button)):hover){text-decoration: none;}:root :where(a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}:root :where(a:where(:not(.wp-element-button)):active){color: var(--wp--preset--color--secondary);text-decoration: none;}h1, h2, h3, h4, h5, h6{font-weight: 400;line-height: 1.4;}h1{font-size: clamp(2.032rem, 2.032rem + ((1vw - 0.2rem) * 2.896), 3.625rem);line-height: 1.2;}h2{font-size: clamp(2.625rem, calc(2.625rem + ((1vw - 0.48rem) * 8.4135)), 3.25rem);line-height: 1.2;}h3{font-size: var(--wp--preset--font-size--x-large);}h4{font-size: var(--wp--preset--font-size--large);}h5{font-size: var(--wp--preset--font-size--medium);font-weight: 700;text-transform: uppercase;}h6{font-size: var(--wp--preset--font-size--medium);text-transform: uppercase;}:root :where(.wp-element-button, .wp-block-button__link){background-color: var(--wp--preset--color--primary);border-radius: 0;border-width: 0;color: var(--wp--preset--color--contrast);font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}:root :where(.wp-element-button:visited, .wp-block-button__link:visited){color: var(--wp--preset--color--contrast);}:root :where(.wp-element-button:hover, .wp-block-button__link:hover){background-color: var(--wp--preset--color--contrast);color: var(--wp--preset--color--base);}:root :where(.wp-element-button:focus, .wp-block-button__link:focus){background-color: var(--wp--preset--color--contrast);color: var(--wp--preset--color--base);}:root :where(.wp-element-button:active, .wp-block-button__link:active){background-color: var(--wp--preset--color--secondary);color: var(--wp--preset--color--base);}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-base-color{color: var(--wp--preset--color--base) !important;}.has-contrast-color{color: var(--wp--preset--color--contrast) !important;}.has-primary-color{color: var(--wp--preset--color--primary) !important;}.has-secondary-color{color: var(--wp--preset--color--secondary) !important;}.has-tertiary-color{color: var(--wp--preset--color--tertiary) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-background-color{background-color: var(--wp--preset--color--base) !important;}.has-contrast-background-color{background-color: var(--wp--preset--color--contrast) !important;}.has-primary-background-color{background-color: var(--wp--preset--color--primary) !important;}.has-secondary-background-color{background-color: var(--wp--preset--color--secondary) !important;}.has-tertiary-background-color{background-color: var(--wp--preset--color--tertiary) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-border-color{border-color: var(--wp--preset--color--base) !important;}.has-contrast-border-color{border-color: var(--wp--preset--color--contrast) !important;}.has-primary-border-color{border-color: var(--wp--preset--color--primary) !important;}.has-secondary-border-color{border-color: var(--wp--preset--color--secondary) !important;}.has-tertiary-border-color{border-color: var(--wp--preset--color--tertiary) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
116.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-xx-large-font-size{font-size: var(--wp--preset--font-size--xx-large) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-system-font-font-family{font-family: var(--wp--preset--font-family--system-font) !important;}.has-source-serif-pro-font-family{font-family: var(--wp--preset--font-family--source-serif-pro) !important;}
117:root :where(.wp-block-navigation){font-size: var(--wp--preset--font-size--small);}
118:root :where(.wp-block-navigation a:where(:not(.wp-element-button))){text-decoration: none;}
119:root :where(.wp-block-navigation a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
120:root :where(.wp-block-navigation a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}
121:root :where(.wp-block-navigation a:where(:not(.wp-element-button)):active){text-decoration: none;}
122:root :where(.wp-block-post-content a:where(:not(.wp-element-button))){color: var(--wp--preset--color--secondary);}
123:root :where(.wp-block-post-title){font-weight: 400;margin-top: 1.25rem;margin-bottom: 1.25rem;}
124:root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;}
125:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
126:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}
127:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):active){color: var(--wp--preset--color--secondary);text-decoration: none;}
128:root :where(.wp-block-comments-title){font-size: var(--wp--preset--font-size--large);margin-bottom: var(--wp--preset--spacing--40);}
129:root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button))){text-decoration: none;}
130:root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
131:root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}
132:root :where(.wp-block-comment-author-name a:where(:not(.wp-element-button)):active){color: var(--wp--preset--color--secondary);text-decoration: none;}
133:root :where(.wp-block-comment-date){font-size: var(--wp--preset--font-size--small);}
134:root :where(.wp-block-comment-date a:where(:not(.wp-element-button))){text-decoration: none;}
135:root :where(.wp-block-comment-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
136:root :where(.wp-block-comment-date a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}
137:root :where(.wp-block-comment-date a:where(:not(.wp-element-button)):active){color: var(--wp--preset--color--secondary);text-decoration: none;}
138:root :where(.wp-block-site-title){font-size: var(--wp--preset--font-size--medium);font-weight: normal;line-height: 1.4;}
139:root :where(.wp-block-site-title a:where(:not(.wp-element-button))){text-decoration: none;}
140:root :where(.wp-block-site-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
141:root :where(.wp-block-site-title a:where(:not(.wp-element-button)):focus){text-decoration: underline dashed;}
142:root :where(.wp-block-site-title a:where(:not(.wp-element-button)):active){color: var(--wp--preset--color--secondary);text-decoration: none;}
143/*# sourceURL=global-styles-inline-css */
144</style>
145<style id="core-block-supports-inline-css">
146.wp-container-core-navigation-is-layout-de66bf79{justify-content:flex-end;}.wp-container-core-group-is-layout-951168c3{justify-content:space-between;}.wp-container-core-columns-is-layout-4f4284ed{flex-wrap:nowrap;}.wp-container-core-group-is-layout-bce5aea8 > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width:1200px;margin-left:auto !important;margin-right:auto !important;}.wp-container-core-group-is-layout-bce5aea8 > .alignwide{max-width:1200px;}.wp-container-core-group-is-layout-bce5aea8 .alignfull{max-width:none;}.wp-container-core-group-is-layout-bce5aea8 > .alignfull{margin-right:calc(var(--wp--preset--spacing--40) * -1);margin-left:calc(var(--wp--preset--spacing--40) * -1);}.wp-container-core-group-is-layout-72d1568c{justify-content:space-between;}
147/*# sourceURL=core-block-supports-inline-css */
148</style>
149<style id="wp-block-template-skip-link-inline-css">
150/*! This file is auto-generated */
151.skip-link.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;word-break:normal!important}.skip-link.screen-reader-text:focus{background-color:#eee;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}
152/*# sourceURL=/wp-includes/css/wp-block-template-skip-link.min.css */
153</style>
154<link rel='stylesheet' id='wp-syntax-css-css' href='https://mikehillyer.com/wordpress/wp-content/plugins/wp-syntax/css/wp-syntax.css?ver=1.2' media='all' />
155<script id="jquery-core-js" src="https://mikehillyer.com/wordpress/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 155
155
156<script id="jquery-migrate-js" src="https://mikehillyer.com/wordpress/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
156
157
158<!-- Google tag (gtag.js) snippet added by Site Kit -->
159<!-- Google Analytics snippet added by Site Kit -->
vendor: 80 bytes, lines 159-160
159
160<script id="google_gtagjs-js" src="https://www.googletagmanager.com/gtag/js?id=
160GT-PL3R7LT
vendor: 18 bytes, line 160
160" async></script>
161<script id="google_gtagjs-js-after">
162window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
163gtag("set","linker",{"domains":["mikehillyer.com"]});
164gtag("js", new Date());
165gtag("set", "developer_id.dZTNiMT", true);
166gtag("config", "GT-PL3R7LT");
167//# sourceURL=google_gtagjs-js-after
168</script>
168
169<link rel="https://api.w.org/" href="https://mikehillyer.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://mikehillyer.com/wp-json/wp/v2/pages/72" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://mikehillyer.com/wordpress/xmlrpc.php?rsd" />
170<link rel='shortlink' href='https://mikehillyer.com/?p=72' />
171<meta name="generator" content="Site Kit by Google 1.188.0" />
171<script id="wp-importmap" type="importmap">
172{"imports":{"@wordpress/interactivity":"https://mikehillyer.com/wordpress/wp-includes/js/dist/script-modules/interactivity/index.min.js?ver=efaa5193bbad9c60ffd1"}}
173</script>
173
174<link rel="modulepreload" href="https://mikehillyer.com/wordpress/wp-includes/js/dist/script-modules/interactivity/index.min.js?ver=efaa5193bbad9c60ffd1" id="@wordpress/interactivity-js-modulepreload" fetchpriority="low">
175<style class="wp-fonts-local">
176@font-face{font-family:"DM Sans";font-style:normal;font-weight:400;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Regular.woff2') format('woff2');font-stretch:normal;}
177@font-face{font-family:"DM Sans";font-style:italic;font-weight:400;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Regular-Italic.woff2') format('woff2');font-stretch:normal;}
178@font-face{font-family:"DM Sans";font-style:normal;font-weight:700;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Bold.woff2') format('woff2');font-stretch:normal;}
179@font-face{font-family:"DM Sans";font-style:italic;font-weight:700;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Bold-Italic.woff2') format('woff2');font-stretch:normal;}
180@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:300;font-display:block;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Light.woff2') format('woff2');font-stretch:normal;}
181@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:block;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Regular.woff2') format('woff2');font-stretch:normal;}
182@font-face{font-family:"IBM Plex Mono";font-style:italic;font-weight:400;font-display:block;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Italic.woff2') format('woff2');font-stretch:normal;}
183@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:700;font-display:block;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Bold.woff2') format('woff2');font-stretch:normal;}
184@font-face{font-family:Inter;font-style:normal;font-weight:200 900;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/inter/Inter-VariableFont_slnt,wght.ttf') format('truetype');font-stretch:normal;}
185@font-face{font-family:"Source Serif Pro";font-style:normal;font-weight:200 900;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Roman.ttf.woff2') format('woff2');font-stretch:normal;}
186@font-face{font-family:"Source Serif Pro";font-style:italic;font-weight:200 900;font-display:fallback;src:url('https://mikehillyer.com/wordpress/wp-content/themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Italic.ttf.woff2') format('woff2');font-stretch:normal;}
187</style>
188</head>
189
190<body class="wp-singular page-template-default page page-id-72 page-child parent-pageid-67 wp-embed-responsive wp-theme-twentytwentythree">
191
192<a class="skip-link screen-reader-text" id="wp-skip-link" href="#wp--skip-link--target">Skip to content</a><div class="wp-site-blocks"><header class="wp-block-template-part">
193<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
194	
195	<div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-951168c3 wp-block-group-is-layout-flex" style="padding-bottom:var(--wp--preset--spacing--40)">
196		<p class="wp-block-site-title"><a href="https://mikehillyer.com" target="_self" rel="home">Mike Hillyer&#039;s Personal Webspace</a></p>
197		<nav class="is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-de66bf79 wp-block-navigation-is-layout-flex" 
198		 data-wp-interactive="core/navigation" data-wp-context='{"overlayOpenedBy":{"click":false,"hover":false,"focus":false},"type":"overlay","roleAttribute":"","ariaLabel":"Menu"}'><button aria-haspopup="dialog" aria-label="Open menu" class="wp-block-navigation__responsive-container-open" 
199				data-wp-on--click="actions.openMenuOnClick"
200				data-wp-on--keydown="actions.handleMenuKeydown"
201			><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
201<path d="M4 7.5h16v1.5H4z"></path><path d="M4 15h16v1.5H4z"></path></svg></button>
202				<div class="wp-block-navigation__responsive-container"  id="modal-1" 
203				data-wp-class--has-modal-open="state.isMenuOpen"
204				data-wp-class--is-menu-open="state.isMenuOpen"
205				data-wp-watch="callbacks.initMenu"
206				data-wp-on--keydown="actions.handleMenuKeydown"
207				data-wp-on--focusout="actions.handleMenuFocusout"
208				tabindex="-1"
209			>
210					<div class="wp-block-navigation__responsive-close" tabindex="-1">
211						<div class="wp-block-navigation__responsive-dialog" 
212				data-wp-bind--aria-modal="state.ariaModal"
213				data-wp-bind--aria-label="state.ariaLabel"
214				data-wp-bind--role="state.roleAttribute"
215			>
216							<button aria-label="Close menu" class="wp-block-navigation__responsive-container-close" 
217				data-wp-on--click="actions.closeMenuOnClick"
218			><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false"><path d="m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z"></path></svg></button>
219							<div class="wp-block-navigation__responsive-container-content" 
220				data-wp-watch="callbacks.focusFirstElement"
221			 id="modal-1-content">
222								<ul class="wp-block-navigation__container is-responsive items-justified-right wp-block-navigation"><li class="wp-block-navigation-item current-menu-item menu-item menu-item-type-post_type menu-item-object-page wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" aria-current="page" title=""><span class="wp-block-navigation-item__label">Managing Hierarchical Data in MySQL</span></a></li><li class="wp-block-navigation-item menu-item menu-item-type-post_type menu-item-object-page wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="https://mikehillyer.com/articles/an-introduction-to-database-normalization/" title=""><span class="wp-block-navigation-item__label">An Introduction to Database Normalization</span></a></li><li class="wp-block-navigation-item menu-item menu-item-type-post_type menu-item-object-post wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="https://mikehillyer.com/email/how-to-send-one-billion-email-marketing-messages-per-month/" title=""><span class="wp-block-navigation-item__label">How To Send One Billion Email Marketing Messages Per Month</span></a></li><li class="wp-block-navigation-item menu-item menu-item-type-post_type menu-item-object-post wp-block-navigation-link"><a class="wp-block-navigation-item__content"  href="https://mikehillyer.com/reviews/trees-and-hierarchies-in-sql/" title=""><span class="wp-block-navigation-item__label">Review u0026#8211; Joe Celkou0026#8217;s Trees and Hierarchies in SQL for Smarties</span></a></li></ul>
223								
224							</div>
225						</div>
226					</div>
227				</div></nav>
228	</div>
229	
230</div>
231
232</header>
233
234
235<main id="wp--skip-link--target" class="wp-block-group is-layout-flow wp-block-group-is-layout-flow" style="margin-top:var(--wp--preset--spacing--50)">
236	
237	<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
238		
239		<h1 style="margin-bottom:var(--wp--preset--spacing--40)" class="wp-block-post-title">Managing Hierarchical Data in MySQL</h1>
240	</div>
241	
242
243	<div class="entry-content wp-block-post-content has-global-padding is-layout-constrained wp-block-post-content-is-layout-constrained"><h3>Introduction</h3>
244<p>Most users at one time or another have dealt with hierarchical data in a SQL database and no doubt learned that the management of hierarchical data is not what a relational database is intended for. The tables of a relational database are not hierarchical (like XML), but are simply a flat list. Hierarchical data has a parent-child relationship that is not naturally represented in a relational database table.</p>
245<p>For our purposes, hierarchical data is a collection of data where each item has a single parent and zero or more children (with the exception of the root item, which has no parent). Hierarchical data can be found in a variety of database applications, including forum and mailing list threads, business organization charts, content management categories, and product categories. For our purposes we will use the following product category hierarchy from an fictional electronics store:</p>
246<p><img fetchpriority="high" decoding="async" class="size-full wp-image-74 alignnone" title="categories" src="http://mikehillyer.com/media//categories.png" alt="" width="664" height="362"></p>
247<p>These categories form a hierarchy in much the same way as the other examples cited above. In this article we will examine two models for dealing with hierarchical data in MySQL, starting with the traditional adjacency list model.</p>
248<h3>The Adjacency List Model</h3>
249<p>Typically the example categories shown above will be stored in a table like the following (I&#8217;m including full CREATE and INSERT statements so you can follow along):</p>
250<pre class="samplecode">CREATE TABLE category(
251        category_id INT AUTO_INCREMENT PRIMARY KEY,
252        name VARCHAR(20) NOT NULL,
253        parent INT DEFAULT NULL
254);
255
256INSERT INTO category VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
257        (4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),(7,'MP3 PLAYERS',6),(8,'FLASH',7),
258        (9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);
259
260SELECT * FROM category ORDER BY category_id;
261+-------------+----------------------+--------+
262| category_id | name                 | parent |
263+-------------+----------------------+--------+
264|           1 | ELECTRONICS          |   NULL |
265|           2 | TELEVISIONS          |      1 |
266|           3 | TUBE                 |      2 |
267|           4 | LCD                  |      2 |
268|           5 | PLASMA               |      2 |
269|           6 | PORTABLE ELECTRONICS |      1 |
270|           7 | MP3 PLAYERS          |      6 |
271|           8 | FLASH                |      7 |
272|           9 | CD PLAYERS           |      6 |
273|          10 | 2 WAY RADIOS         |      6 |
274+-------------+----------------------+--------+
27510 rows in set (0.00 sec)</pre>
276<p>In the adjacency list model, each item in the table contains a pointer to its parent. The topmost element, in this case <em>electronics</em>, has a NULL value for its parent. The adjacency list model has the advantage of being quite simple, it is easy to see that<em>FLASH</em> is a child of<em>mp3</em> players, which is a child of <em>portable electronics</em>, which is a child of <em>electronics</em>. While the adjacency list model can be dealt with fairly easily in client-side code, working with the model can be more problematic in pure SQL.</p>
277<h4>Retrieving a Full Tree</h4>
278<p>The first common task when dealing with hierarchical data is the display of the entire tree, usually with some form of indentation. The most common way of doing this is in pure SQL is through the use of a self-join:</p>
279<pre class="samplecode">SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
280FROM category AS t1
281LEFT JOIN category AS t2 ON t2.parent = t1.category_id
282LEFT JOIN category AS t3 ON t3.parent = t2.category_id
283LEFT JOIN category AS t4 ON t4.parent = t3.category_id
284WHERE t1.name = 'ELECTRONICS';
285
286+-------------+----------------------+--------------+-------+
287| lev1        | lev2                 | lev3         | lev4  |
288+-------------+----------------------+--------------+-------+
289| ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |
290| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |
291| ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |
292| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |
293| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |
294| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |
295+-------------+----------------------+--------------+-------+
2966 rows in set (0.00 sec)</pre>
297<h4>Finding all the Leaf Nodes</h4>
298<p>We can find all the leaf nodes in our tree (those with no children) by using a LEFT JOIN query:</p>
299<pre class="samplecode">SELECT t1.name FROM
300category AS t1 LEFT JOIN category as t2
301ON t1.category_id = t2.parent
302WHERE t2.category_id IS NULL;
303
304+--------------+
305| name         |
306+--------------+
307| TUBE         |
308| LCD          |
309| PLASMA       |
310| FLASH        |
311| CD PLAYERS   |
312| 2 WAY RADIOS |
313+--------------+</pre>
314<h4>Retrieving a Single Path</h4>
315<p>The self-join also allows us to see the full path through our hierarchies:</p>
316<pre class="samplecode">SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
317FROM category AS t1
318LEFT JOIN category AS t2 ON t2.parent = t1.category_id
319LEFT JOIN category AS t3 ON t3.parent = t2.category_id
320LEFT JOIN category AS t4 ON t4.parent = t3.category_id
321WHERE t1.name = 'ELECTRONICS' AND t4.name = 'FLASH';
322
323+-------------+----------------------+-------------+-------+
324| lev1        | lev2                 | lev3        | lev4  |
325+-------------+----------------------+-------------+-------+
326| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
327+-------------+----------------------+-------------+-------+
3281 row in set (0.01 sec)</pre>
329<p>The main limitation of such an approach is that you need one self-join for every level in the hierarchy, and performance will naturally degrade with each level added as the joining grows in complexity.</p>
330<h4>Limitations of the Adjacency List Model</h4>
331<p>Working with the adjacency list model in pure SQL can be difficult at best. Before being able to see the full path of a category we have to know the level at which it resides. In addition, special care must be taken when deleting nodes because of the potential for orphaning an entire sub-tree in the process (delete the portable electronics category and all of its children are orphaned). Some of these limitations can be addressed through the use of client-side code or stored procedures. With a procedural language we can start at the bottom of the tree and iterate upwards to return the full tree or a single path. We can also use procedural programming to delete nodes without orphaning entire sub-trees by promoting one child element and re-ordering the remaining children to point to the new parent.</p>
332<p>&nbsp;</p>
333<p>[amazon-related-products keywords=&#8221;
333joe celko trees&#8221;]</p>
334<h3>The Nested Set Model</h3>
335<p>What I would like to focus on in this article is a different approach, commonly referred to as the <strong>Nested Set Model</strong>. In the Nested Set Model, we can look at our hierarchy in a new way, not as nodes and lines, but as nested containers. Try picturing our electronics categories this way:</p>
336<p><img decoding="async" class="alignnone size-full wp-image-76" title="nested_categories" src="http://mikehillyer.com/media//nested_categories.png" alt="" width="702" height="218"></p>
337<p>Notice how our hierarchy is still maintained, as parent categories envelop their children.We represent this form of hierarchy in a table through the use of left and right values to represent the nesting of our nodes:</p>
338<pre class="samplecode">CREATE TABLE nested_category (
339        category_id INT AUTO_INCREMENT PRIMARY KEY,
340        name VARCHAR(20) NOT NULL,
341        lft INT NOT NULL,
342        rgt INT NOT NULL
343);
344
345INSERT INTO nested_category VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
346 (4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
347 (9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);
348
349SELECT * FROM nested_category ORDER BY category_id;
350
351+-------------+----------------------+-----+-----+
352| category_id | name                 | lft | rgt |
353+-------------+----------------------+-----+-----+
354|           1 | ELECTRONICS          |   1 |  20 |
355|           2 | TELEVISIONS          |   2 |   9 |
356|           3 | TUBE                 |   3 |   4 |
357|           4 | LCD                  |   5 |   6 |
358|           5 | PLASMA               |   7 |   8 |
359|           6 | PORTABLE ELECTRONICS |  10 |  19 |
360|           7 | MP3 PLAYERS          |  11 |  14 |
361|           8 | FLASH                |  12 |  13 |
362|           9 | CD PLAYERS           |  15 |  16 |
363|          10 | 2 WAY RADIOS         |  17 |  18 |
364+-------------+----------------------+-----+-----+</pre>
365<p>We use <strong>lft</strong> and <strong>rgt</strong> because <em>left</em> and <em>right</em> are reserved words in MySQL, see <a href="http://dev.mysql.com/doc/mysql/en/reserved-words.html">http://dev.mysql.com/doc/mysql/en/reserved-words.html</a> for the full list of reserved words.</p>
366<p>So how do we determine left and right values? We start numbering at the leftmost side of the outer node and continue to the right:</p>
367<p><img decoding="async" class="alignnone size-full wp-image-79" title="nested_numbered" src="http://mikehillyer.com/media//nested_numbered.png" alt="" width="642" height="194"></p>
368<p>This design can be applied to a typical tree as well:</p>
369<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-80" title="numbered_tree" src="http://mikehillyer.com/media//numbered_tree.png" alt="" width="695" height="362"></p>
370<p>When working with a tree, we work from left to right, one layer at a time, descending to each node&#8217;s children before assigning a right-hand number and moving on to the right. This approach is called the <strong>modified preorder tree traversal algorithm</strong>.</p>
371<h4>Retrieving a Full Tree</h4>
372<p>We can retrieve the full tree through the use of a self-join that links parents with nodes on the basis that a node&#8217;s <strong>lft</strong> value will always appear between its parent&#8217;s <strong>lft</strong> and <strong>rgt</strong> values:</p>
373<pre class="samplecode">SELECT node.name
374FROM nested_category AS node,
375        nested_category AS parent
376WHERE node.lft BETWEEN parent.lft AND parent.rgt
377        AND parent.name = 'ELECTRONICS'
378ORDER BY node.lft;
379
380+----------------------+
381| name                 |
382+----------------------+
383| ELECTRONICS          |
384| TELEVISIONS          |
385| TUBE                 |
386| LCD                  |
387| PLASMA               |
388| PORTABLE ELECTRONICS |
389| MP3 PLAYERS          |
390| FLASH                |
391| CD PLAYERS           |
392| 2 WAY RADIOS         |
393+----------------------+</pre>
394<p>Unlike our previous examples with the adjacency list model, this query will work regardless of the depth of the tree. We do not concern ourselves with the rgt value of the node in our BETWEEN clause because the rgt value will always fall within the same parent as the lft values.</p>
395<h4>Finding all the Leaf Nodes</h4>
396<p>Finding all leaf nodes in the nested set model even simpler than the LEFT JOIN method used in the adjacency list model. If you look at the nested_category table, you may 
396notice that the lft and rgt values for leaf nodes are consecutive numbers. To find the leaf nodes, we look for nodes where rgt = lft + 1:</p>
397<pre class="samplecode">SELECT name
398FROM nested_category
399WHERE rgt = lft + 1;
400
401+--------------+
402| name         |
403+--------------+
404| TUBE         |
405| LCD          |
406| PLASMA       |
407| FLASH        |
408| CD PLAYERS   |
409| 2 WAY RADIOS |
410+--------------+</pre>
411<h4>Retrieving a Single Path</h4>
412<p>With the nested set model, we can retrieve a single path without having multiple self-joins:</p>
413<pre class="samplecode">SELECT parent.name
414FROM nested_category AS node,
415        nested_category AS parent
416WHERE node.lft BETWEEN parent.lft AND parent.rgt
417        AND node.name = 'FLASH'
418ORDER BY parent.lft;
419
420+----------------------+
421| name                 |
422+----------------------+
423| ELECTRONICS          |
424| PORTABLE ELECTRONICS |
425| MP3 PLAYERS          |
426| FLASH                |
427+----------------------+</pre>
428<p>[amazon-related-products keywords=&#8221;mysql&#8221;]</p>
429<h4>Finding the Depth of the Nodes</h4>
430<p>We have already looked at how to show the entire tree, but what if we want to also show the depth of each node in the tree, to better identify how each node fits in the hierarchy? This can be done by adding a COUNT function and a GROUP BY clause to our existing query for showing the entire tree:</p>
431<pre class="samplecode">SELECT node.name, (COUNT(parent.name) - 1) AS depth
432FROM nested_category AS node,
433        nested_category AS parent
434WHERE node.lft BETWEEN parent.lft AND parent.rgt
435GROUP BY node.name
436ORDER BY node.lft;
437
438+----------------------+-------+
439| name                 | depth |
440+----------------------+-------+
441| ELECTRONICS          |     0 |
442| TELEVISIONS          |     1 |
443| TUBE                 |     2 |
444| LCD                  |     2 |
445| PLASMA               |     2 |
446| PORTABLE ELECTRONICS |     1 |
447| MP3 PLAYERS          |     2 |
448| FLASH                |     3 |
449| CD PLAYERS           |     2 |
450| 2 WAY RADIOS         |     2 |
451+----------------------+-------+</pre>
452<p>We can use the depth value to indent our category names with the CONCAT and REPEAT string functions:</p>
453<pre class="samplecode">SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
454FROM nested_category AS node,
455        nested_category AS parent
456WHERE node.lft BETWEEN parent.lft AND parent.rgt
457GROUP BY node.name
458ORDER BY node.lft;
459
460+-----------------------+
461| name                  |
462+-----------------------+
463| ELECTRONICS           |
464|  TELEVISIONS          |
465|   TUBE                |
466|   LCD                 |
467|   PLASMA              |
468|  PORTABLE ELECTRONICS |
469|   MP3 PLAYERS         |
470|    FLASH              |
471|   CD PLAYERS          |
472|   2 WAY RADIOS        |
473+-----------------------+</pre>
474<p>Of course, in a client-side application you will be more likely to use the depth value directly to display your hierarchy. Web developers could loop through the tree, adding &lt;li&gt;&lt;/li&gt; and &lt;ul&gt;&lt;/ul&gt; tags as the depth number increases and decreases.</p>
475<h4>Depth of a Sub-Tree</h4>
476<p>When we need depth information for a sub-tree, we cannot limit either the node or parent tables in our self-join because it will corrupt our results. Instead, we add a third self-join, along with a sub-query to determine the depth that will be the new starting point for our sub-tree:</p>
477<pre class="samplecode">SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
478FROM nested_category AS node,
479        nested_category AS parent,
480        nested_category AS sub_parent,
481        (
482                SELECT node.name, (COUNT(parent.name) - 1) AS depth
483                FROM nested_category AS node,
484                nested_category AS parent
485                WHERE node.lft BETWEEN parent.lft AND parent.rgt
486                AND node.name = 'PORTABLE ELECTRONICS'
487                GROUP BY node.name
488                ORDER BY node.lft
489        )AS sub_tree
490WHERE node.lft BETWEEN parent.lft AND parent.rgt
491        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
492        AND sub_parent.name = sub_tree.name
493GROUP BY node.name
494ORDER BY node.lft;
495
496+----------------------+-------+
497| name                 | depth |
498+----------------------+-------+
499| PORTABLE ELECTRONICS |     0 |
500| MP3 PLAYERS          |     1 |
501| FLASH                |     2 |
502| CD PLAYERS           |     1 |
503| 2 WAY RADIOS         |     1 |
504+----------------------+-------+</pre>
505<p>
505This function can be used with any node name, including the root node. The depth values are always relative to the named node.</p>
506<p><!--adsense--></p>
507<h4>Find the Immediate Subordinates of a Node</h4>
508<p>Imagine you are showing a category of electronics products on a retailer web site. When a user clicks on a category, you would want to show the products of that category, as well as list its immediate sub-categories, but not the entire tree of categories beneath it. For this, we need to show the node and its immediate sub-nodes, but no further down the tree. For example, when showing the PORTABLE ELECTRONICS category, we will want to show MP3 PLAYERS, CD PLAYERS, and 2 WAY RADIOS, but not FLASH.</p>
509<p>This can be easily accomplished by adding a HAVING clause to our previous query:</p>
510<pre class="samplecode">SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
511FROM nested_category AS node,
512        nested_category AS parent,
513        nested_category AS sub_parent,
514        (
515                SELECT node.name, (COUNT(parent.name) - 1) AS depth
516                FROM nested_category AS node,
517                        nested_category AS parent
518                WHERE node.lft BETWEEN parent.lft AND parent.rgt
519                        AND node.name = 'PORTABLE ELECTRONICS'
520                GROUP BY node.name
521                ORDER BY node.lft
522        )AS sub_tree
523WHERE node.lft BETWEEN parent.lft AND parent.rgt
524        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
525        AND sub_parent.name = sub_tree.name
526GROUP BY node.name
527HAVING depth &lt;= 1
528ORDER BY node.lft;
529
530+----------------------+-------+
531| name                 | depth |
532+----------------------+-------+
533| PORTABLE ELECTRONICS |     0 |
534| MP3 PLAYERS          |     1 |
535| CD PLAYERS           |     1 |
536| 2 WAY RADIOS         |     1 |
537+----------------------+-------+</pre>
538<p>If you do not wish to show the parent node, change the <strong>HAVING depth &lt;= 1</strong> line to <strong>HAVING depth = 1</strong>.</p>
539<h4>Aggregate Functions in a Nested Set</h4>
540<p>Let&#8217;s add a table of products that we can use to demonstrate aggregate functions with:</p>
541<pre class="samplecode">CREATE TABLE product
542(
543        product_id INT AUTO_INCREMENT PRIMARY KEY,
544        name VARCHAR(40),
545        category_id INT NOT NULL
546);
547
548INSERT INTO product(name, category_id) VALUES('20" TV',3),('36" TV',3),
549('Super-LCD 42"',4),('Ultra-Plasma 62"',5),('Value Plasma 38"',5),
550('Power-MP3 5gb',7),('Super-Player 1gb',8),('Porta CD',9),('CD To go!',9),
551('Family Talk 360',10);
552
553SELECT * FROM product;
554
555+------------+-------------------+-------------+
556| product_id | name              | category_id |
557+------------+-------------------+-------------+
558|          1 | 20" TV            |           3 |
559|          2 | 36" TV            |           3 |
560|          3 | Super-LCD 42"     |           4 |
561|          4 | Ultra-Plasma 62"  |           5 |
562|          5 | Value Plasma 38"  |           5 |
563|          6 | Power-MP3 128mb   |           7 |
564|          7 | Super-Shuffle 1gb |           8 |
565|          8 | Porta CD          |           9 |
566|          9 | CD To go!         |           9 |
567|         10 | Family Talk 360   |          10 |
568+------------+-------------------+-------------+</pre>
569<p>Now let&#8217;s produce a query that can retrieve our category tree, along with a product count for each category:</p>
570<pre class="samplecode">SELECT parent.name, COUNT(product.name)
571FROM nested_category AS node ,
572        nested_category AS parent,
573        product
574WHERE node.lft BETWEEN parent.lft AND parent.rgt
575        AND node.category_id = product.category_id
576GROUP BY parent.name
577ORDER BY node.lft;
578
579+----------------------+---------------------+
580| name                 | COUNT(product.name) |
581+----------------------+---------------------+
582| ELECTRONICS          |                  10 |
583| TELEVISIONS          |                   5 |
584| TUBE                 |                   2 |
585| LCD                  |                   1 |
586| PLASMA               |                   2 |
587| PORTABLE ELECTRONICS |                   5 |
588| MP3 PLAYERS          |                   2 |
589| FLASH                |                   1 |
590| CD PLAYERS           |                   2 |
591| 2 WAY RADIOS         |                   1 |
592+----------------------+---------------------+</pre>
593<p>This is our typical whole tree query with a COUNT and GROUP BY added, along with a reference to the product table and a join between the node and product table in the WHERE clause. As you can see, there is a count for each category and the count of subcategories is reflected in the parent categories.</p>
594<h4>Adding New Nodes</h4>
595<p>Now that we have learned how to query our tree, we should take a look at how to update our tree by adding a new node. Let&#8217;s look at our nested set diagram again:</p>
596<p><img decoding="async" class="alignnone size-full wp-image-79" title="nested_numbered" src="http://mikehillyer.com/media//nested_numbered.png" alt="" width="642" height="194"></p>
597<p>If we wanted to add a new node between the TELEVISIONS and PORTABLE ELECTRONICS nodes, the new node would have lft and rgt values of 10 and 11, and all nodes to its right would have their lft and rgt values increased by two. We would then add the new node with the appropriate lft and rgt values. While this can be done with a stored procedure in MySQL 5, I will assume for the moment that most readers are using 4.1, as it is the latest stable version, and I will isolate my queries with a LOCK TABLES statement instead:</p>
598<pre class="samplecode">LOCK TABLE nested_category WRITE;
599
600SELECT @myRight := rgt FROM nested_category
601WHERE name = 'TELEVISIONS';
602
603UPDATE nested_category SET rgt = rgt + 2 WHERE rgt &gt; @myRight;
604UPDATE nested_category SET lft = lft + 2 WHERE lft &gt; @myRight;
605
606INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);
607
608UNLOCK TABLES;</pre>
609<p>We can then check our nesting with our indented tree query:</p>
610<pre class="samplecode">SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
611FROM nested_category AS node,
612        nested_category AS parent
613WHERE node.lft BETWEEN parent.lft AND parent.rgt
614GROUP BY node.name
615ORDER BY node.lft;
616
617+-----------------------+
618| name                  |
619+-----------------------+
620| ELECTRONICS           |
621|  TELEVISIONS          |
622|   TUBE                |
623|   LCD                 |
624|   PLASMA              |
625|  GAME CONSOLES        |
626|  PORTABLE ELECTRONICS |
627|   MP3 PLAYERS         |
628|    FLASH              |
629|   CD PLAYERS          |
630|   2 WAY RADIOS        |
631+-----------------------+</pre>
632<p>If we instead want to add a node as a child of a node that has no existing children, we need to modify our procedure slightly. Let&#8217;s add a new FRS node below the 2 WAY RADIOS node:</p>
633<pre class="samplecode">LOCK TABLE nested_category WRITE;
634
635SELECT @myLeft := lft FROM nested_category
636
637WHERE name = '2 WAY RADIOS';
638
639UPDATE nested_category SET rgt = rgt + 2 WHERE rgt &gt; @myLeft;
640UPDATE nested_category SET lft = lft + 2 WHERE lft &gt; @myLeft;
641
642INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2);
643
644UNLOCK TABLES;</pre>
645<p>In this example we expand everything to the right of the left-hand number of our proud new parent node, then place the node to the right of the left-hand value. As you can see, our new node is now properly nested:</p>
646<pre class="samplecode">SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
647FROM nested_category AS node,
648        nested_category AS parent
649WHERE node.lft BETWEEN parent.lft AND parent.rgt
650GROUP BY node.name
651ORDER BY node.lft;
652
653+-----------------------+
654| name                  |
655+-----------------------+
656| ELECTRONICS           |
657|  TELEVISIONS          |
658|   TUBE                |
659|   LCD                 |
660|   PLASMA              |
661|  GAME CONSOLES        |
662|  PORTABLE ELECTRONICS |
663|   MP3 PLAYERS         |
664|    FLASH              |
665|   CD PLAYERS          |
666|   2 WAY RADIOS        |
667|    FRS                |
668+-----------------------+</pre>
669<h4>Deleting Nodes</h4>
670<p>The last basic task involved in working with nested sets is the removal of nodes. The course of action you take when deleting a node depends on the node&#8217;s position in the hierarchy; deleting leaf nodes is easier than deleting nodes with children because we have to handle the orphaned nodes.</p>
671<p>When deleting a leaf node, the process if just the opposite of adding a new node, we delete the node and its width from every node to its right:</p>
672<pre class="samplecode">LOCK TABLE nested_category WRITE;
673
674SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
675FROM nested_category
676WHERE name = 'GAME CONSOLES';
677
678DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;
679
680UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt &gt; @myRight;
681UPDATE nested_category SET lft = lft - @myWidth WHERE lft &gt; @myRight;
682
683UNLOCK TABLES;</pre>
684<p>And once again, we execute our indented tree query to confirm that our node has been deleted without corrupting the hierarchy:</p>
685<pre class="samplecode">SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
686FROM nested_category AS node,
687        nested_category AS parent
688WHERE node.lft BETWEEN parent.lft AND parent.rgt
689GROUP BY node.name
690ORDER BY node.lft;
691
692+-----------------------+
693| name                  |
694+-----------------------+
695| ELECTRONICS           |
696|  TELEVISIONS          |
697|   TUBE                |
698|   LCD                 |
699|   PLASMA              |
700|  PORTABLE ELECTRONICS |
701|   MP3 PLAYERS         |
702|    FLASH              |
703|   CD PLAYERS          |
704|   2 WAY RADIOS        |
705|    FRS                |
706+-----------------------+</pre>
707<p>This approach works equally well to delete a node and all its children:</p>
708<pre class="samplecode">LOCK TABLE nested_category WRITE;
709
710SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
711FROM nested_category
712WHERE name = 'MP3 PLAYERS';
713
714DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;
715
716UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt &gt; @myRight;
717UPDATE nested_category SET lft = lft - @myWidth WHERE lft &gt; @myRight;
718
719UNLOCK TABLES;</pre>
720<p>And once again, we query to see that we have successfully deleted an entire sub-tree:</p>
721<pre class="samplecode">SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
722FROM nested_category AS node,
723        nested_category AS parent
724WHERE node.lft BETWEEN parent.lft AND parent.rgt
725GROUP BY node.name
726ORDER BY node.lft;
727
728+-----------------------+
729| name                  |
730+-----------------------+
731| ELECTRONICS           |
732|  TELEVISIONS          |
733|   TUBE                |
734|   LCD                 |
735|   PLASMA              |
736|  PORTABLE ELECTRONICS |
737|   CD PLAYERS          |
738|   2 WAY RADIOS        |
739|    FRS                |
740+-----------------------+</pre>
741<p>The other scenario we have to deal with is the deletion of a parent node but not the children. In some cases you may wish to just change the name to a placeholder until a replacement is presented, such as when a supervisor is fired. In other cases, the child nodes should all be moved up to the level of the deleted parent:</p>
742<pre class="samplecode">LOCK TABLE nested_category WRITE;
743
744SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
745FROM nested_category
746WHERE name = 'PORTABLE ELECTRONICS';
747
748DELETE FROM nested_category WHERE lft = @myLeft;
749
750UPDATE nested_category SET rgt = rgt - 1, lft = lft - 1 WHERE lft BETWEEN @myLeft AND @myRight;
751UPDATE nested_category SET rgt = rgt - 2 WHERE rgt &gt; @myRight;
752UPDATE nested_category SET lft = lft - 2 WHERE lft &gt; @myRight;
753
754UNLOCK TABLES;</pre>
755<p>In this case we subtract two from all elements to the right of the node (since without children it would have a width of two), and one from the nodes that are its children (to close the gap created by the loss of the parent&#8217;s left value). Once again, we can confirm our elements have been promoted:</p>
756<pre class="samplecode">SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
757FROM nested_category AS node,
758        nested_category AS parent
759WHERE node.lft BETWEEN parent.lft AND parent.rgt
760GROUP BY node.name
761ORDER BY node.lft;
762
763+---------------+
764| name          |
765+---------------+
766| ELECTRONICS   |
767|  TELEVISIONS  |
768|   TUBE        |
769|   LCD         |
770|   PLASMA      |
771|  CD PLAYERS   |
772|  2 WAY RADIOS |
773|   FRS         |
774+---------------+</pre>
775<p>Other scenarios when deleting nodes would include promoting one of the children to the parent position and moving the child nodes under a sibling of the parent node, but for the sake of space these scenarios will not be covered in this article.</p>
776<h3>Final Thoughts</h3>
777<p>While I hope the information within this article will be of use to you, the concept of nested sets in SQL has been around for over a decade, and there is a lot of additional information available in books and on the Internet. In my opinion the most comprehensive source of information on managing hierarchical information is a book called <a href="http://www.openwin.org/mike/books/index.php/trees-and-hierarchies-in-sql">Joe Celko&#8217;s Trees and Hierarchies in SQL for Smarties</a>, written by a very respected author in the field of advanced SQL, Joe Celko. Joe Celko is often credited 
777with the nested sets model and is by far the most prolific author on the subject. I have found Celko&#8217;s book to be an invaluable resource in my own studies and highly recommend it. The book covers advanced topics which I have not covered in this article, and provides additional methods for managing hierarchical data in addition to the Adjacency List and Nested Set models.</p>
778<p>In the References / Resources section that follows I have listed some web resources that may be of use in your research of managing hierarchal data, including a pair of PHP related resources that include pre-built PHP libraries for handling nested sets in MySQL. Those of you who currently use the adjacency list model and would like to experiment with the nested set model will find sample code for converting between the two in the <a href="http://www.sitepoint.com/article/hierarchical-data-database">Storing Hierarchical Data in a Database</a> resource listed below.</p>
779<p>[amazon-related-products keywords=&#8221;database&#8221;]</p>
780<h3>References / Resources</h3>
781<ul>
782<li><a href="http://www.openwin.org/mike/books/index.php/trees-and-hierarchies-in-sql">Joe Celko&#8217;s Trees and Hierarchies in SQL for Smarties</a> &#8211; ISBN 1-55860-920-2</li>
783<li><a href="http://www.sitepoint.com/article/hierarchical-data-database">Storing Hierarchical Data in a Database</a></li>
784<li><a href="http://www.dbmsmag.com/9603d06.html">A Look at SQL Trees</a></li>
785<li><a href="http://www.dbmsmag.com/9604d06.html">SQL Lessons</a></li>
786<li><a href="http://www.dbmsmag.com/9605d06.html">Nontraditional Databases</a></li>
787<li><a href="http://www.intelligententerprise.com/001020/celko.jhtml?_requestid=123193">Trees in SQL</a></li>
788<li><a href="http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html">Trees in SQL (2)</a></li>
789<li><a href="http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci801943,00.html">Converting an adjacency list model to a nested set model</a></li>
790<li><a href="http://www.klempert.de/php/nested_sets_demo">Nested Sets in PHP Demonstration (German)</a></li>
791<li><a href="http://dev.e-taller.net/dbtree/">A Nested Set Library in PHP</a></li>
792</ul>
793</div>
794	<section class="wp-block-template-part">
795<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-bce5aea8 wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)">
796<div class="wp-block-comments">
797<h2 class="wp-block-heading">Comments</h2>
798
799
800<h3 id="comments" class="wp-block-comments-title">136 responses to &#8220;Managing Hierarchical Data in MySQL&#8221;</h3>
801
802<ol class="wp-block-comment-template"><li id="comment-4024" class="comment even thread-even depth-1">
803
804<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
805<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Doug Meyer Avatar' src='https://secure.gravatar.com/avatar/1695b318268005832b832f1ef5e6a18c1e81a8fc7d7a4cdce3c339e847c3b096?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1695b318268005832b832f1ef5e6a18c1e81a8fc7d7a4cdce3c339e847c3b096?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
806
807
808
809<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Doug Meyer</div>
810
811
812<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-04-24T04:39:49-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4024">2012/04/24</a></time></div>
813
814</div>
815
816
817<div class="wp-block-comment-content"><p>Very nice and concise article, Mike. I bought Joe Celko&#8217;s book that you referenced and have skimmed, then read it. Your article helps me to understand the Nested Set model. I&#8217;m an old dog who has been writing adjacency list hierarchies since the early nineties. I always thought there could be &#8216;better way&#8217;, and this is certainly it. Thanks for taking the time to explain it all, Mike.</p>
818</div>
819
820</div>
821</div>
822
823</li>
823<li id="comment-4102" class="comment odd alt thread-odd thread-alt depth-1">
824
825<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
826<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Chris M Avatar' src='https://secure.gravatar.com/avatar/bc42b68109763e529e259efcd4b04ea692fdaecb995299a9a192598290de2ffe?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/bc42b68109763e529e259efcd4b04ea692fdaecb995299a9a192598290de2ffe?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
827
828
829
830<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Chris M</div>
831
832
833<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-04-27T09:44:13-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4102">2012/04/27</a></time></div>
834
835</div>
836
837
838<div class="wp-block-comment-content"><p>Could this be made to work for hierarchies where a child can have more than one parent?</p>
839</div>
840
841</div>
842</div>
843
844<ol><li id="comment-4103" class="comment even depth-2">
845
846<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
847<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mike Hillyer Avatar' src='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
848
849
850
851<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://mikehillyer.com/about-me/" target="_self" >Mike Hillyer</a></div>
852
853
854<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-04-27T09:47:31-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4103">2012/04/27</a></time></div>
855
856</div>
857
858
859<div class="wp-block-comment-content"><p>At that point you&#8217;re dealing with a graph instead of a hierarchy. If you&#8217;re using MySQL you may want to look at the following storage engine by an associate of mine: <a href="http://openquery.com/products/graph-engine" rel="nofollow">http://openquery.com/products/graph-engine</a></p>
860</div>
861
862</div>
863</div>
864
865</li></ol></li><li id="comment-4489" class="comment odd alt thread-even depth-1">
866
867<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
868<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Daniel Avatar' src='https://secure.gravatar.com/avatar/99219b3a385a55b0e44205c5fc551a4eb3f8e1bc17bb4665819ee7fa04b285fc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/99219b3a385a55b0e44205c5fc551a4eb3f8e1bc17bb4665819ee7fa04b285fc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
869
870
871
872<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.shareyourride.net/" target="_self" >Daniel</a></div>
873
874
875<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-05-20T15:17:08-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4489">2012/05/20</a></time></div>
876
877</div>
878
879
880<div class="wp-block-comment-content"><p>Hi Mike;</p>
881<p>thanks for your well described tutorial. I noticed you do a &#8220;GROUP BY node.name&#8221; in quite a few example queries here. This is very bad practice and will return some unex
881pected results as soon as you have a few hundred records where node.name is not unique anymore.<br />
882You should group your rows by ID instead.</p>
883</div>
884
885</div>
886</div>
887
888</li><li id="comment-4661" class="comment even thread-odd thread-alt depth-1">
889
890<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
891<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mukesh Avatar' src='https://secure.gravatar.com/avatar/8588390ad52555ab3bcf93c2322f55ac0450436cff5877ecbb8996846d0949fd?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8588390ad52555ab3bcf93c2322f55ac0450436cff5877ecbb8996846d0949fd?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
892
893
894
895<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Mukesh</div>
896
897
898<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-06-01T23:42:05-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4661">2012/06/01</a></time></div>
899
900</div>
901
902
903<div class="wp-block-comment-content"><p>I am a beginner php programmer and want to develop a mlm web application in php &amp; mysql,but I have no idea about it.<br />
904My mlm webapplication&#8217;s requirement is-<br />
9051.It work on binary tree in which every node only have left and right child.<br />
9062.In this we can add node as our wish which be add in left or right.<br />
907So how can implement it?</p>
908</div>
909
910</div>
911</div>
912
913</li><li id="comment-4700" class="comment odd alt thread-even depth-1">
914
915<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
916<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Ramakant Avatar' src='https://secure.gravatar.com/avatar/a1302e452a2b04b3775767a506289c1a9bc41fe8428bee521cc76ebb005b23d4?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a1302e452a2b04b3775767a506289c1a9bc41fe8428bee521cc76ebb005b23d4?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
917
918
919
920<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Ramakant</div>
921
922
923<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-06-05T05:26:46-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4700">2012/06/05</a></time></div>
924
925</div>
926
927
928<div class="wp-block-comment-content"><p>Very useful link to see example of self joins<br />
929Here you can select user and parent from same table<br />
930<a href="http://www.devshed.com/c/a/MySQL/MySQL-Table-Joins/4/" rel="nofollow ugc">http://www.devshed.com/c/a/MySQL/MySQL-Table-Joins/4/</a></p>
931<p>what i use is here:</p>
932<p>select distinct e.employeeid,<b>e.givenname</b>,e.contact_no,<b>b.givenname as parent_name</b>,e.status from employee as e ,employee as b, agent_details as a,user_group as u<br />
933   where a.agent_id = e.employeeid AND a.parent_id=b.employeeid AND e.employeeid=u.employeeid AND u.groupid=10  GROUP BY e.employeeid ORDER BY e.givenname</p>
934</div>
935
936</div>
937</div>
938
939</li><li id="comment-4718" class="comment even thread-odd thread-alt depth-1">
940
941<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
942<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Bartek Avatar' src='https://secure.gravatar.com/avatar/287a0ed31ae6fb1689d3d478c958cc6111b0a47f508946ede72145140c74c1dc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/287a0ed31ae6fb1689d3d478c958cc6111b0a47f508946ede72145140c74c1dc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
943
944
945
946<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Bartek</div>
947
948
949<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-06-07T00:03:34-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4718">2012/06/07</a></time></div>
950
951</div>
952
953
954<div class="wp-block-comment-content"><p>I use this data model for years. I first found it on dev.mysql.com few years back. I have structures many levels deep and data with hundreds of rows &#8211; It never fails, it&#8217;s really fast. The ability to cut part of the structure with one question is simply awesome! It is part of my framework now with full credit to Mike of course 🙂 Thank you so much for sharing.</p>
955</div>
956
957</div>
958</div>
959
960<ol>
960<li id="comment-15893" class="comment odd alt depth-2">
961
962<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
963<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='ashwini Avatar' src='https://secure.gravatar.com/avatar/731769b22cd2e586e15c923aa3b85d4e07709fede9bc56b3faa414af6d0535fb?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/731769b22cd2e586e15c923aa3b85d4e07709fede9bc56b3faa414af6d0535fb?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
964
965
966
967<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">ashwini</div>
968
969
970<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2013-02-06T02:41:53-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-15893">2013/02/06</a></time></div>
971
972</div>
973
974
975<div class="wp-block-comment-content"><p>How do you manage inserts? I beleive you would have a programmatic way of doing inserts. Most online resources on this subject start from &#8220;pen-paper&#8221;, as in, number nodes/elements by hand and then fire individual inserts. Is there a resource that takes in a tree/xml and generates the numbering?</p>
976</div>
977
978</div>
979</div>
980
981</li></ol></li><li id="comment-4843" class="comment even thread-even depth-1">
982
983<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
984<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Leo Avatar' src='https://secure.gravatar.com/avatar/be8a2bd3928443cb98af2610670ffb910fd07b84b59d7f134644e48eef623711?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/be8a2bd3928443cb98af2610670ffb910fd07b84b59d7f134644e48eef623711?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
985
986
987
988<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Leo</div>
989
990
991<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-06-14T19:46:41-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4843">2012/06/14</a></time></div>
992
993</div>
994
995
996<div class="wp-block-comment-content"><p>I like your code for &#8220;Retrieving a Single Path&#8221; in a &#8220;Nested Set Model&#8221;.</p>
997<p>However, how would you retrieve a single path if there were multiple nodes with the same name?  For example, what if Flash was listed both under MP3 Players and under Movie Characters, and you wanted to retrieve the path that led to the mov
997ie character only?</p>
998</div>
999
1000</div>
1001</div>
1002
1003</li><li id="comment-4844" class="comment odd alt thread-odd thread-alt depth-1">
1004
1005<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1006<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Clay Stuckey Avatar' src='https://secure.gravatar.com/avatar/6521fb5d766fdb5e3069060439a645f9d0dd52e64dc1c4f091e6d9cc1315a098?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6521fb5d766fdb5e3069060439a645f9d0dd52e64dc1c4f091e6d9cc1315a098?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1007
1008
1009
1010<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Clay Stuckey</div>
1011
1012
1013<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-06-14T21:15:37-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-4844">2012/06/14</a></time></div>
1014
1015</div>
1016
1017
1018<div class="wp-block-comment-content"><p>Your adjacency model is super close to what I need. Is it possible to perform the &#8220;retrieve a full tree&#8221; query and have the number of &#8220;children&#8221; be dynamic. Your example will work great if you have =1 levels.</p>
1019</div>
1020
1021</div>
1022</div>
1023
1024</li><li id="comment-5141" class="comment even thread-even depth-1">
1025
1026<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1027<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Martin Andreev Avatar' src='https://secure.gravatar.com/avatar/d77b8426920e811d9221bf493955583e6a5f3ce94db6172900c50c856f7d27cf?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d77b8426920e811d9221bf493955583e6a5f3ce94db6172900c50c856f7d27cf?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1028
1029
1030
1031<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Martin Andreev</div>
1032
1033
1034<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-07-04T13:33:19-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5141">2012/07/04</a></time></div>
1035
1036</div>
1037
1038
1039<div class="wp-block-comment-content"><p>Awesome tutorial. I am really impressed. Its something that i didn&#8217;t know and i&#8217;ll gladly use it 🙂 Thank your for taking you time to write it.</p>
1040</div>
1041
1042</div>
1043</div>
1044
1045</li><li id="comment-5206" class="comment odd alt thread-odd thread-alt depth-1">
1046
1047<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1048<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Alejandro Palacios Avatar' src='https://secure.gravatar.com/avatar/18b8a1eb1072034a8aa9106da252efe81179387386faa0fc7955814cc12f3eb1?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/18b8a1eb1072034a8aa9106da252efe81179387386faa0fc7955814cc12f3eb1?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1049
1050
1051
1052<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Alejandro Palacios</div>
1053
1054
1055<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-07-10T22:38:31-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5206">2012/07/10</a></time></div>
1056
1057</div>
1058
1059
1060<div class="wp-block-comment-content"><p>Very nice explanation of the adjacent list and nested set models,</p>
1061<p>thanks a lot !</p>
1062</div>
1063
1064</div>
1065</div>
1066
1067</li>
1067<li id="comment-5386" class="comment even thread-even depth-1">
1068
1069<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1070<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='anand Avatar' src='https://secure.gravatar.com/avatar/179983c86250d397710a7d7d5ecc331feaf66969d49a5dc2a64c219bccb76d69?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/179983c86250d397710a7d7d5ecc331feaf66969d49a5dc2a64c219bccb76d69?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1071
1072
1073
1074<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://selfreading" target="_self" >anand</a></div>
1075
1076
1077<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-07-25T08:01:45-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5386">2012/07/25</a></time></div>
1078
1079</div>
1080
1081
1082<div class="wp-block-comment-content"><p>really very help full for developing my project<br />
1083super like </p>
1084<p>Thanks</p>
1085</div>
1086
1087</div>
1088</div>
1089
1090</li><li id="comment-5452" class="comment odd alt thread-odd thread-alt depth-1">
1091
1092<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1093<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Chris Avatar' src='https://secure.gravatar.com/avatar/5c24a51de77f7437bba3e1e0ee13f1e687666363f1498440a67cae76792ea79b?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5c24a51de77f7437bba3e1e0ee13f1e687666363f1498440a67cae76792ea79b?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1094
1095
1096
1097<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Chris</div>
1098
1099
1100<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-07-30T00:54:23-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5452">2012/07/30</a></time></div>
1101
1102</div>
1103
1104
1105<div class="wp-block-comment-content"><p>In your demonstration of inserting a row between &#8216;Televisions&#8217; and &#8216;Portable Electronics&#8217;, what if the table was extremely large, perhaps hundreds of thousands of rows, and the left insert point were very close to zero? Unlike an adjency list, such an insert into a nested set will trigger massive updates.</p>
1106<p>It seems to me that a good extension to the model might be to reserve space, perhaps depth dependent, so insertions trigger less expansive updates.</p>
1107</div>
1108
1109</div>
1110</div>
1111
1112</li><li id="comment-5506" class="comment even thread-even depth-1">
1113
1114<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1115<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Rasmus Schultz Avatar' src='https://secure.gravatar.com/avatar/9445f567f43ee7a963270651e40e533634586f959e4df3d5398d001b1cb49be8?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9445f567f43ee7a963270651e40e533634586f959e4df3d5398d001b1cb49be8?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1116
1117
1118
1119<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://blog.mindplay.dk" target="_self" >Rasmus Schultz</a></div>
1120
1121
1122<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-02T11:26:47-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5506">2012/08/02</a></time></div>
1123
1124</div>
1125
1126
1127<div class="wp-block-comment-content"><p>Very useful article &#8211; I had to do some digging, as this article recently vanished from mysql.com for some reason. The formatting of this article on your blog is somewhat broken &#8211; it would be nice if you could clean this up so it&#8217;s legible again. Thanks!</p>
1128</div>
1129
1130</div>
1131</div>
1132
1133</li>
1133<li id="comment-5536" class="pingback odd alt thread-odd thread-alt depth-1">
1134
1135<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1136<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1137
1138
1139
1140<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://fatal-errors.com/mysql-structure-of-website-with-parent-and-child-topics-5/174401" target="_self" >MySQL structure of website with parent and child topics</a></div>
1141
1142
1143<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-04T14:44:54-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5536">2012/08/04</a></time></div>
1144
1145</div>
1146
1147
1148<div class="wp-block-comment-content"><p>[&#8230;] have thought about using a single hierarchical table like that on: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> that i know can output a list like [&#8230;]</p>
1149</div>
1150
1151</div>
1152</div>
1153
1154</li><li id="comment-5555" class="comment even thread-even depth-1">
1155
1156<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1157<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Andy Taylor Avatar' src='https://secure.gravatar.com/avatar/a1946892bc24e0b5e037f9ccd2027da2b8ed0eae0590b4b8943e173648986aea?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a1946892bc24e0b5e037f9ccd2027da2b8ed0eae0590b4b8943e173648986aea?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1158
1159
1160
1161<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Andy Taylor</div>
1162
1163
1164<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-05T15:52:18-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5555">2012/08/05</a></time></div>
1165
1166</div>
1167
1168
1169<div class="wp-block-comment-content"><p>Firstly, huge thanks for a great &amp; clear explanation.<br />
1170I implemented some of your code examples against a database I&#8217;d generated of a hard disk directory structure and got some strange results.<br />
1171In the examples you&#8217;ve given, you&#8217;re using &#8216;GROUP BY node.name&#8217;. However, if I understand things correctly, this will only work if &#8216;node.name&#8217; is unique for all entries.<br />
1172If, as I discovered, you have multiple entries with the same &#8216;node.name&#8217; then doing &#8216;GROUP BY node.category_id&#8217; seems to work.</p>
1173</div>
1174
1175</div>
1176</div>
1177
1178</li><li id="comment-5588" class="pingback odd alt thread-odd thread-alt depth-1">
1179
1180<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1181<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1182
1183
1184
1185<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://pradipchitrakar.com.np/programming/threaded-comment-system/" target="_self" >How to create threaded comment system using PHP, MySQL, jQuery and Ajax</a></div>
1186
1187
1188<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-08T02:32:02-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5588">2012/08/08</a></time></div>
1189
1190</div>
1191
1192
1193<div class="wp-block-comment-content"><p>[&#8230;] Take a look at <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/&#038;nbsp" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/&#038;nbsp</a>; for detail information on hierarchical relation in SQL. Assuming you have read this link, the [&#8230;]</p>
1194</div>
1195
1196</div>
1197</div>
1198
1199</li>
1199<li id="comment-5628" class="comment even thread-even depth-1">
1200
1201<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1202<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Marcus Ahle Avatar' src='https://secure.gravatar.com/avatar/0061f84c3d40e8245d5e369bbe63f5e1b611f61385c9ef47124739ab6dd4110b?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0061f84c3d40e8245d5e369bbe63f5e1b611f61385c9ef47124739ab6dd4110b?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1203
1204
1205
1206<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Marcus Ahle</div>
1207
1208
1209<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-10T09:39:18-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5628">2012/08/10</a></time></div>
1210
1211</div>
1212
1213
1214<div class="wp-block-comment-content"><p>How big of strain does this place on the Db when the amount of categories gets large?  For example, say you have 3 main categories, Electrnics, Clothing, and groceries.  Say each of those has 200 total nodes underneath each. When adding a new node to the very beginning seems like it could place a big strain in terms of having to update the lft and rgt of hundreds of nodes. At what point does size hinder performance?</p>
1215</div>
1216
1217</div>
1218</div>
1219
1220</li><li id="comment-5787" class="pingback odd alt thread-odd thread-alt depth-1">
1221
1222<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1223<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1224
1225
1226
1227<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://alinnica.com/trees-and-hierarchical-data-in-mysql-using-the-nested-sets-model/" target="_self" >Trees and Hierarchical Data in mySQL using the nested sets model &laquo; Alin&#039;s DevBlog</a></div>
1228
1229
1230<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-08-21T08:43:07-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-5787">2012/08/21</a></time></div>
1231
1232</div>
1233
1234
1235<div class="wp-block-comment-content"><p>[&#8230;] this made you curious, I recommend reading this article <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>. The examples in the article are based on Joe Celko’s &#8216;Trees and Hierarchies in SQL for [&#8230;]</p>
1236</div>
1237
1238</div>
1239</div>
1240
1241</li><li id="comment-6116" class="comment even thread-even depth-1">
1242
1243<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1244<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Zeeshan Avatar' src='https://secure.gravatar.com/avatar/3a20b4219d3a68a6cf350f0b592833627e5a94699e756b324dc957d8772d46ec?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3a20b4219d3a68a6cf350f0b592833627e5a94699e756b324dc957d8772d46ec?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1245
1246
1247
1248<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Zeeshan</div>
1249
1250
1251<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-09-15T04:54:52-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-6116">2012/09/15</a></time></div>
1252
1253</div>
1254
1255
1256<div class="wp-block-comment-content"><p>+1 to you Mike, I had the same table schema but implemented the retrieval stuff in PHP code which was a bit slow (I used it for categories on a retail store portal). I was looking for an idea about hierarchical retrieval via SQL queries, and you gave me a great food for thought.</p>
1257</div>
1258
1259</div>
1260</div>
1261
1262</li>
1262<li id="comment-6294" class="comment odd alt thread-odd thread-alt depth-1">
1263
1264<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1265<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Ercan Mutlu Avatar' src='https://secure.gravatar.com/avatar/4fcf5a6f8d96e461113f454580d83ca7003c2d49c3f9d8292b233b78e511b7f0?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4fcf5a6f8d96e461113f454580d83ca7003c2d49c3f9d8292b233b78e511b7f0?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1266
1267
1268
1269<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://emsistem.com" target="_self" >Ercan Mutlu</a></div>
1270
1271
1272<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-09-28T00:01:14-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-6294">2012/09/28</a></time></div>
1273
1274</div>
1275
1276
1277<div class="wp-block-comment-content"><p>Hi,Nice article BUT ON Adjacency List Model Getting CAt-&gt;SUbs YOU HAVE WRONG QUERY OR NOT PROPER QUERY, I CANT LIST<br />
1278LIKE THIS :<br />
1279Missing cats-subs<br />
1280a-&gt;  (I need this id)<br />
1281a-&gt;b (Also this   id)</p>
1282<p>Your Cat-subs<br />
1283a-&gt;b-&gt;c (NO directly THIS ID)<br />
1284a-&gt;b-&gt;c-&gt;d<br />
1285&#8230;<br />
1286YOUR QUERY PROBLEM IS :<br />
1287 CORRECT QUERY MUST BE<br />
1288&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
1289  ELECTRONICS | NULL                 |NULL         | NULL  |<br />
1290  ELECTRONICS | TELEVISIONS          |NULL         | NULL  |<br />
1291  ELECTRONICS | TELEVISIONS          |TUBE         | NULL  |</p>
1292<p>YOURQUERY<br />
1293&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
1294| ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |<br />
1295| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |<br />
1296| ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |</p>
1297<p>AND the Question IS HOR TO GET LIKE THIS ?</p>
1298</div>
1299
1300</div>
1301</div>
1302
1303</li><li id="comment-10443" class="comment even thread-even depth-1">
1304
1305<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1306<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Tim Avatar' src='https://secure.gravatar.com/avatar/6b039998610aa7ac3b35e0829a5db47a2f94e595d4217475114d9775fde9467a?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6b039998610aa7ac3b35e0829a5db47a2f94e595d4217475114d9775fde9467a?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1307
1308
1309
1310<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Tim</div>
1311
1312
1313<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-11-27T17:30:17-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-10443">2012/11/27</a></time></div>
1314
1315</div>
1316
1317
1318<div class="wp-block-comment-content"><p>Great article.  Really helpful.  Quick question though.  Let&#8217;s say I want to get the entire tree but the depth be an offset from the current queried node.  For example (querying for Portable Electronics):</p>
1319<p>Electronics = -1<br />
1320Portable Electronics = 0<br />
1321MP# Players = 1<br />
1322CD Player = 1<br />
13232 Way Radio = 1<br />
1324Flash = 2</p>
1325</div>
1326
1327</div>
1328</div>
1329
1330</li>
1330<li id="comment-12140" class="comment odd alt thread-odd thread-alt depth-1">
1331
1332<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1333<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Marco Demaio Avatar' src='https://secure.gravatar.com/avatar/97c072c56da8b8bc74330f2f7a2eebb4ba30a1e94cc1bd173be9406cc2eb98e8?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/97c072c56da8b8bc74330f2f7a2eebb4ba30a1e94cc1bd173be9406cc2eb98e8?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1334
1335
1336
1337<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://stackoverflow.com/users/260080/marco-demaio" target="_self" >Marco Demaio</a></div>
1338
1339
1340<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-12-16T10:25:50-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-12140">2012/12/16</a></time></div>
1341
1342</div>
1343
1344
1345<div class="wp-block-comment-content"><p>Great article, I looked for it on dev.mysql but it&#8217;s not ther anymore.</p>
1346<p>One question on Adjacency List Model:</p>
1347<p>Let&#8217;s say you have in table also <code>position</code> INT field, that let&#8217;s you sort nodes that are <strong>on the same level</strong>, in your example let&#8217;s say I want &#8220;LCD&#8221; to come before &#8220;TUBE&#8221;, or I want &#8220;PORTABLE ELECTRONICS&#8221; to come before &#8220;TELEVISION&#8221;.<br />
1348Is it still possible to retrieve the full tree with one single query as in your example, but with the nodes already ordered also by position?</p>
1349<p>Cause I think adding just <code>ORDER BY position</code> at the end of the query would not be a solution.</p>
1350</div>
1351
1352</div>
1353</div>
1354
1355</li><li id="comment-12473" class="comment even thread-even depth-1">
1356
1357<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1358<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='ivanr Avatar' src='https://secure.gravatar.com/avatar/9a9c4bac5c23c4e2376b10b80ef6aa82311a73ffec7734988e5d3cbcc4ee7e92?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9a9c4bac5c23c4e2376b10b80ef6aa82311a73ffec7734988e5d3cbcc4ee7e92?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1359
1360
1361
1362<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">ivanr</div>
1363
1364
1365<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-12-20T16:10:48-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-12473">2012/12/20</a></time></div>
1366
1367</div>
1368
1369
1370<div class="wp-block-comment-content"><p>Great article Mike! I have a menu structured in the adjacency list model and  I needed to retrieve a single path where the last node could be at any level. I ended up writing a stored procedure that would return one string the different nodes separated by semi-colon and have PHP parse that string.</p>
1371<p>The code is something like this, bear in mind I&#8217;m not the best coder and I&#8217;m sure it can be optimized:</p>
1372<pre lang="sql">
1373CREATE DEFINER=`root`@`localhost` PROCEDURE `GetMenuPath`(IN `myNode` VARCHAR(50), OUT `menuPath` VARCHAR(200))
1374    NO SQL
1375begin
1376
1377declare myParent int;
1378declare myNewParent int;
1379declare myNewPath varchar(200);
1380
1381set menuPath = myNode;
1382select menu_parent into myParent from menu where menu_item = myNode;
1383
1384while myParent &gt; 0 do  /* Not zero or null */
1385	select concat(menuPath, ';', menu_item) into myNewPath from menu where menu_id = myParent;
1386	set menuPath = myNewPath;
1387	select menu_parent into myNewParent from menu where menu_id = myParent;
1388	set myParent = myNewParent;
1389end while;
1390
1391end
1392</pre>
1393</div>
1394
1395</div>
1396</div>
1397
1398</li>
1398<li id="comment-12842" class="comment odd alt thread-odd thread-alt depth-1">
1399
1400<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1401<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Stefan Stavrev Avatar' src='https://secure.gravatar.com/avatar/e70cd404f280c2c0cae1e29c8e76f1db551ce04fd901156e54fa2551c4611fe2?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e70cd404f280c2c0cae1e29c8e76f1db551ce04fd901156e54fa2551c4611fe2?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1402
1403
1404
1405<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Stefan Stavrev</div>
1406
1407
1408<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-12-26T03:27:16-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-12842">2012/12/26</a></time></div>
1409
1410</div>
1411
1412
1413<div class="wp-block-comment-content"><p>If I may point one possible improvement over your model. When you do your SELECT and GROUP BY statements, to use the ID instead of the name. Imagine you have child nodes with the same name, but different parents.</p>
1414</div>
1415
1416</div>
1417</div>
1418
1419</li><li id="comment-12892" class="comment even thread-even depth-1">
1420
1421<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1422<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Choerun Asnawi Avatar' src='https://secure.gravatar.com/avatar/132a84e7261b760ecfcc8e0253bc9a876e44cca79b6a7aa3069aaba30e0cf5d7?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/132a84e7261b760ecfcc8e0253bc9a876e44cca79b6a7aa3069aaba30e0cf5d7?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1423
1424
1425
1426<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://asnawi.stmikayani.ac.id/" target="_self" >Choerun Asnawi</a></div>
1427
1428
1429<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2012-12-26T21:29:45-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-12892">2012/12/26</a></time></div>
1430
1431</div>
1432
1433
1434<div class="wp-block-comment-content"><p>Good article! In addition, use this query to simulate the &#8220;old-way&#8221; adjacency list model table structure:</p>
1435<pre>
1436SELECT child.category_id AS category_id,
1437  child.name AS name,
1438  parent.category_id AS parent
1439FROM nested_category AS child
1440  LEFT JOIN nested_category AS parent
1441    ON parent.lft = (
1442      SELECT MAX(anchestor.lft)
1443      FROM nested_category AS node,
1444        nested_category AS anchestor
1445      WHERE anchestor.lft  node.rgt
1446        AND node.category_id = child.category_id
1447    )
1448  ORDER BY child.lft;
1449</pre>
1450</div>
1451
1452</div>
1453</div>
1454
1455</li><li id="comment-13590" class="comment odd alt thread-odd thread-alt depth-1">
1456
1457<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1458<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='victor wallin Avatar' src='https://secure.gravatar.com/avatar/7244d0f2833269114de402ece79c5f061f280e96ca132404dc32ad5275284739?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7244d0f2833269114de402ece79c5f061f280e96ca132404dc32ad5275284739?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1459
1460
1461
1462<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">victor wallin</div>
1463
1464
1465<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2013-01-07T04:43:00-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-13590">2013/01/07</a></time></div>
1466
1467</div>
1468
1469
1470<div class="wp-block-comment-content"><p>1) It&#8217;s okay to have credits hole in the series?<br />
1471| name | lft | rgt |<br />
1472| ELECTRONICS | 1 | 8 |<br />
1473| TELEVISION | 2 | 3 |<br />
1474| PORTABLE ELECTRONICS | 6 | 7 |</p>
1475<p>2) is this a good idea?<br />
1476| Name | lft | rgt | parent_lft | parentrgt |<br />
1477| ELECTRONICS | 1 | 8 | NULL | NULL |<br />
1478| TELEVISION | 2 | 3 | 1 | 8 |<br />
1479| PORTABLE ELECTRONICS | 6 | 7 | 1 | 8 |</p>
1480<p>3) what is the easiest way to convert a tree to a Nested Set?</p>
1481</div>
1482
1483</div>
1484</div>
1485
1486<ol><li id="comment-50600" class="comment even depth-2">
1487
1488<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1489<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='shahzad Avatar' src='https://secure.gravatar.com/avatar/c6bac0d31bb36a6f7f8d8914b3baace078039088e8f770bdde4fe0acff164d0c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c6bac0d31bb36a6f7f8d8914b3baace078039088e8f770bdde4fe0acff164d0c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1490
1491
1492
1493<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://Reviewsite" target="_self" >shahzad</a></div>
1494
1495
1496<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-01-18T03:47:13-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-50600">2014/01/18</a></time></div>
1497
1498</div>
1499
1500
1501<div class="wp-block-comment-content"><p>I have a category structure up to 5 level<br />
1502Music -&gt; Pop -&gt; Michael Jackson -&gt; Thriller -&gt; Thriller &#8211; Song<br />
1503Suppose i want to search the category with like query &#8216;%s%&#8217;.</p>
1504<p>Now s is in 3 level (Level1 = Music),(Level3 = Michael Jackson ),(Level5 = Thriller &#8211; Song ).</p>
1505<p>Now its give me 3 results instead of 1. How i will get 1 results?<br />
1506If i found the result at first level(levle1), it will not search at second level (level2).<br />
1507if i found the result at Second level(levle2), it will not search at Third level (level3) and so on.</p>
1508<p>Have you idea?</p>
1509</div>
1510
1511</div>
1512</div>
1513
1514</li></ol></li><li id="comment-49554" class="comment odd alt thread-even depth-1">
1515
1516<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1517<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Oguzcan Avatar' src='https://secure.gravatar.com/avatar/7f10495a69c757e5f1d76e005c5891c73e3a35f87fb2e25609661693ec2a0183?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7f10495a69c757e5f1d76e005c5891c73e3a35f87fb2e25609661693ec2a0183?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1518
1519
1520
1521<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Oguzcan</div>
1522
1523
1524<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-01-05T16:46:29-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-49554">2014/01/05</a></time></div>
1525
1526</div>
1527
1528
1529<div class="wp-block-comment-content"><p>Thank you in advance for this article. Could you show how to add new root nodes ?</p>
1530</div>
1531
1532</div>
1533</div>
1534
1535<ol><li id="comment-301489" class="comment even depth-2">
1536
1537<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1538<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Gerry Avatar' src='https://secure.gravatar.com/avatar/09da8c03649217e8047bbca53d75fedeb83cbd469114cab8daf4aaadfcad4cc7?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/09da8c03649217e8047bbca53d75fedeb83cbd469114cab8daf4aaadfcad4cc7?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1539
1540
1541
1542<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://vveprymu.com" target="_self" >Gerry</a></div>
1543
1544
1545<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-27T17:31:02-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-301489">2016/01/27</a></time></div>
1546
1547</div>
1548
1549
1550<div class="wp-block-comment-content"><p>Heck yeah this is excltay what I needed.</p>
1551</div>
1552
1553</div>
1554</div>
1555
1556</li></ol></li>
1556<li id="comment-51316" class="comment odd alt thread-odd thread-alt depth-1">
1557
1558<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1559<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Quick Correction Avatar' src='https://secure.gravatar.com/avatar/451d4c79960a9b86df7ee29444d4f6fc4f44feec7f25fad7217bdd1ced9d67c3?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/451d4c79960a9b86df7ee29444d4f6fc4f44feec7f25fad7217bdd1ced9d67c3?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1560
1561
1562
1563<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Quick Correction</div>
1564
1565
1566<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-01-29T11:43:09-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-51316">2014/01/29</a></time></div>
1567
1568</div>
1569
1570
1571<div class="wp-block-comment-content"><p>In the ordering for the nested set, I believe it should be<br />
1572&#8216;ORDER BY parent.lft&#8217; as opposed to &#8216;node.lft&#8217;.</p>
1573<p>If we look at the Retrieving a Single Path section, it does not make sense to order by node.lft, since node.lft is all the same tuple (we&#8217;ve queried for a node.lft=&#8217;FLASH&#8217;).</p>
1574<p>If we had a &#8220;SELECT parent.name, node.name &#8230;&#8221; it would like like the following:</p>
1575<p>name                                    | name<br />
1576&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
1577MP3 PLAYERS                     | FLASH<br />
1578FLASH                                  | FLASH<br />
1579ELECTRONICS                     | FLASH<br />
1580PORTABLE ELECTRONICS | FLASH</p>
1581</div>
1582
1583</div>
1584</div>
1585
1586</li><li id="comment-51605" class="pingback even thread-even depth-1">
1587
1588<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1589<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1590
1591
1592
1593<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://emsusefulsql.wordpress.com/2014/02/06/mysql-leaf-nodes/" target="_self" >mySQL | leaf nodes | SQL snippets</a></div>
1594
1595
1596<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-02-06T12:06:15-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-51605">2014/02/06</a></time></div>
1597
1598</div>
1599
1600
1601<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
1602</div>
1603
1604</div>
1605</div>
1606
1607</li><li id="comment-67884" class="comment odd alt thread-odd thread-alt depth-1">
1608
1609<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1610<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Heinz Avatar' src='https://secure.gravatar.com/avatar/fcc2cf066365c4e474dcdd227900c59b35b6c2aef1687d2b0e960ce1875bd4dc?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fcc2cf066365c4e474dcdd227900c59b35b6c2aef1687d2b0e960ce1875bd4dc?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1611
1612
1613
1614<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Heinz</div>
1615
1616
1617<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-04-02T07:23:03-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-67884">2014/04/02</a></time></div>
1618
1619</div>
1620
1621
1622<div class="wp-block-comment-content"><p>Hello<br />
1623I have set up my page with nested tree. But the biggest problem is still when I add a new category/subcategory. Afterwards you have to renumber all articles in your database because most of them got a new category number. If you have 500&#8217;000 acticle this takes long and all your references change too.<br />
1624I wonder how ebay is doing this? You can&#8217;t stop trading while updating.</p>
1625</div>
1626
1627</div>
1628</div>
1629
1630<ol>
1630<li id="comment-67887" class="comment even depth-2">
1631
1632<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1633<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mike Hillyer Avatar' src='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1634
1635
1636
1637<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://mikehillyer.com/about-me/" target="_self" >Mike Hillyer</a></div>
1638
1639
1640<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-04-02T07:31:19-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-67887">2014/04/02</a></time></div>
1641
1642</div>
1643
1644
1645<div class="wp-block-comment-content"><p>Hello Heinz, look at <a href="http://www.amazon.com/gp/product/0123877334/ref=as_li_ss_tl?ie=UTF8&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0123877334&#038;linkCode=as2&#038;tag=mikehillyer-20" target="_blank" rel="nofollow">Trees and Hierarchies in SQL for Smarties</a> to get a lot of advanced tips. One I can share here is to look at using index numbers that increment by 1,000 instead of by one, when you need to add a node you place it between two existing index numbers, then occasionally during slow periods you re-index everything.</p>
1646</div>
1647
1648</div>
1649</div>
1650
1651</li></ol></li><li id="comment-70210" class="comment odd alt thread-even depth-1">
1652
1653<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1654<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mohsen Nekoulal Tak Avatar' src='https://secure.gravatar.com/avatar/43e7928bd8ea22214906df82c4abd2ecb9395b4c890f3e45dc186ea1459c444f?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/43e7928bd8ea22214906df82c4abd2ecb9395b4c890f3e45dc186ea1459c444f?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1655
1656
1657
1658<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Mohsen Nekoulal Tak</div>
1659
1660
1661<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-04-05T09:27:51-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-70210">2014/04/05</a></time></div>
1662
1663</div>
1664
1665
1666<div class="wp-block-comment-content"><p>very nice article. But now i have a question. how can i receive directly a specified depth of a optional parent? For example, i choose PORTABLE ELECTRONICS as the parent and i want to get the depth:2 which will be resulted the FLASH.<br />
1667Can u help me?</p>
1668</div>
1669
1670</div>
1671</div>
1672
1673</li><li id="comment-260362" class="comment even thread-odd thread-alt depth-1">
1674
1675<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1676<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Misha Dar Avatar' src='https://secure.gravatar.com/avatar/aeffca704969dc0a244f6ea930668509af55a7e3218c7ed0cda5de481a5db1e1?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/aeffca704969dc0a244f6ea930668509af55a7e3218c7ed0cda5de481a5db1e1?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1677
1678
1679
1680<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Misha Dar</div>
1681
1682
1683<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2014-11-04T12:30:11-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-260362">2014/11/04</a></time></div>
1684
1685</div>
1686
1687
1688<div class="wp-block-comment-content"><p>First compliments on article &#8211; it&#8217;s really straight &amp; forward explaining approach concepts of building hierarchical model in RDBS.<br />
1689But, with all respect you can not take full advantage of using it in real world in MySQL DB engine without applied knowledge in structuring and using Spatial Data Type  extension&#8230; cause using default (BTREE) index to perform nested set join like</p>
1690<p><i>FROM nested_table AS node,  nested_category AS parent</i></p>
1691<p>will chock a query on performance in mega volume sets.</p>
1692<p>So in MySQL, LFT RGT columns define as geometrical data type is highly recommended and so self cartesian product join will look something like:</p>
1693<p>FROM nested_table AS node<br />
1694JOIN nested_table AS  AS parent ON (MBRWithin(Point(0, node.lft), parent.lft_rgt_range))</p>
1695<p>or close to it 🙂<br />
1696Cheers</p>
1697</div>
1698
1699</div>
1700</div>
1701
1702<ol>
1702<li id="comment-307288" class="comment odd alt depth-2">
1703
1704<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1705<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Peter Salzmann Avatar' src='https://secure.gravatar.com/avatar/040f48299fc7ae47a4d3d47669f2ab9a79fd2d81600fafbd561e1b7f7c326a25?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/040f48299fc7ae47a4d3d47669f2ab9a79fd2d81600fafbd561e1b7f7c326a25?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1706
1707
1708
1709<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.ilance.com" target="_self" >Peter Salzmann</a></div>
1710
1711
1712<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-10-15T23:20:46-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-307288">2016/10/15</a></time></div>
1713
1714</div>
1715
1716
1717<div class="wp-block-comment-content"><p>Misha is correct.</p>
1718<p>We&#8217;ve built an Enterprise marketplace product and converted from Adj. to Nested.  It&#8217;s incredible how fast result sets are accomplished with the proper query.  While the queries in this article work they are definitely not large-category + huge product volume set ready.. everything works great with &lt; 1,000 products and/or &lt; 10,000 categories.</p>
1719<p>What&#039;s missing from this article IMO is the spatial aspect on the table joins for the categories.  For example:</p>
1720<p>products table contains 1 million products<br />
1721categories table contains 28,301 categories.</p>
1722<p>How we accomplish the finishing touches to make it production ready was the following:<br />
1723SELECT &#8230;<br />
1724FROM category AS node<br />
1725JOIN category AS parent ON (MBRWithin(Point(0, node.lft), parent.sets))<br />
1726&#8230;..</p>
1727<p>Without it a category with 11,000 items results in 18 seconds delay.  With the ON clause to the parent table join reduced it to &lt; 0.1 second.  It&#039;s blazing fast.  We&#039;ve also added necessary single and combined indexes which also help I&#039;m sure.</p>
1728<p>You&#039;ll need (if your category table is named category):</p>
1729<p>ALTER TABLE category ADD `sets` LINESTRING NOT NULL<br />
1730UPDATE category SET `sets` = LineString(Point(-1, lft), Point(1, rgt))<br />
1731CREATE SPATIAL INDEX sx_categories_sets on category (sets) </p>
1732<p>If you do your queries a different way, we do it 2 different ways; you can try this one as well:</p>
1733<p>SELECT &#8230;<br />
1734FROM category AS parent<br />
1735JOIN category AS midpoint<br />
1736JOIN category AS node<br />
1737&#8230;.<br />
1738AND (MBRWithin(Point(0, node.lft), parent.sets))</p>
1739<p>Let me know if it helps!<br />
1740Cheers!</p>
1741</div>
1742
1743</div>
1744</div>
1745
1746</li></ol></li><li id="comment-282341" class="pingback even thread-even depth-1">
1747
1748<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1749<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1750
1751
1752
1753<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://dluat.com/hierarcy-query-mysql/" target="_self" >Hierarcy Query Mysql &#8211; DL-UAT</a></div>
1754
1755
1756<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-02T20:52:02-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-282341">2015/01/02</a></time></div>
1757
1758</div>
1759
1760
1761<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
1762</div>
1763
1764</div>
1765</div>
1766
1767</li>
1767<li id="comment-282582" class="pingback odd alt thread-odd thread-alt depth-1">
1768
1769<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1770<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1771
1772
1773
1774<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://php4switch.wordpress.com/2015/01/08/77/" target="_self" >PHP 4 Switch</a></div>
1775
1776
1777<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-08T03:02:31-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-282582">2015/01/08</a></time></div>
1778
1779</div>
1780
1781
1782<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
1783</div>
1784
1785</div>
1786</div>
1787
1788</li><li id="comment-282708" class="pingback even thread-even depth-1">
1789
1790<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1791<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1792
1793
1794
1795<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://dluat.com/stored-procedure-to-update-an-adjacency-model-to-nested-sets-model/" target="_self" >Stored Procedure to update an adjacency Model to Nested Sets Model | DL-UAT</a></div>
1796
1797
1798<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-12T02:25:22-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-282708">2015/01/12</a></time></div>
1799
1800</div>
1801
1802
1803<div class="wp-block-comment-content"><p>[&#8230;] You can also take a look here [&#8230;]</p>
1804</div>
1805
1806</div>
1807</div>
1808
1809</li><li id="comment-282851" class="pingback odd alt thread-odd thread-alt depth-1">
1810
1811<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1812<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1813
1814
1815
1816<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://iust.pp.ua/2015/01/15/solution-how-to-determine-the-first-and-last-iteration-in-a-foreach-loop-solution-programming-it/" target="_self" >Solution: How to determine the first and last iteration in a foreach loop? #solution #programming #it | IT Info</a></div>
1817
1818
1819<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-15T13:13:34-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-282851">2015/01/15</a></time></div>
1820
1821</div>
1822
1823
1824<div class="wp-block-comment-content"><p>[&#8230;] You should consider using Nested Sets to store your tree structure. Additionally you can improve the whole thing by using recursive [&#8230;]</p>
1825</div>
1826
1827</div>
1828</div>
1829
1830</li><li id="comment-283220" class="pingback even thread-even depth-1">
1831
1832<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1833<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1834
1835
1836
1837<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://fytro.info/how-to-merge-two-tables-for-a-query/" target="_self" >How to merge two tables for a query? | FYTRO SPORTS</a></div>
1838
1839
1840<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-25T10:06:08-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-283220">2015/01/25</a></time></div>
1841
1842</div>
1843
1844
1845<div class="wp-block-comment-content"><p>[&#8230;
1845] I am using Nested Tree Model [&#8230;]</p>
1846</div>
1847
1848</div>
1849</div>
1850
1851</li><li id="comment-283411" class="comment odd alt thread-odd thread-alt depth-1">
1852
1853<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1854<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Adam Avatar' src='https://secure.gravatar.com/avatar/3633ccbc8d2535710a93edad0e90307711585024e9733d5722f8203dc8b333c8?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3633ccbc8d2535710a93edad0e90307711585024e9733d5722f8203dc8b333c8?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1855
1856
1857
1858<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Adam</div>
1859
1860
1861<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-01-29T23:45:44-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-283411">2015/01/29</a></time></div>
1862
1863</div>
1864
1865
1866<div class="wp-block-comment-content"><p>Hello friends. I&#8217;ve just switched from Adjacency List Model to nested set model.</p>
1867<p>I&#8217;think i&#8217;m starting to understand what is going on, but i have big problem &#8211; i cannot draw my tree as html menu. i found some sources/examples (<a href="http://stackoverflow.com/questions/1310649/getting-a-modified-preorder-tree-traversal-model-nested-set-into-a-ul" rel="nofollow ugc">http://stackoverflow.com/questions/1310649/getting-a-modified-preorder-tree-traversal-model-nested-set-into-a-ul</a>) on the net, but it&#8217;s a little hard to me to port them to work with Your examples. Can anybody help me with that? Thank you.</p>
1868</div>
1869
1870</div>
1871</div>
1872
1873</li><li id="comment-283750" class="comment even thread-even depth-1">
1874
1875<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1876<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='spratters Avatar' src='https://secure.gravatar.com/avatar/c97b134c1ae5a96c7db370cdf343265f00015347257856623562b2a9b718c95d?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c97b134c1ae5a96c7db370cdf343265f00015347257856623562b2a9b718c95d?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
1877
1878
1879
1880<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">spratters</div>
1881
1882
1883<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-02-04T04:28:26-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-283750">2015/02/04</a></time></div>
1884
1885</div>
1886
1887
1888<div class="wp-block-comment-content"><p>Hey there,<br />
1889Just wanted to thank you for the article. I was working out ways to best get results from a nested set and my mind was turning to mush. Luckily I had a read through this article and all became clear.<br />
1890Cheers</p>
1891</div>
1892
1893</div>
1894</div>
1895
1896</li><li id="comment-283851" class="pingback odd alt thread-odd thread-alt depth-1">
1897
1898<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1899<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1900
1901
1902
1903<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.52sourcecode.com/post-28017.html" target="_self" >Getting the depth of a nested set model query | 我爱源码网</a></div>
1904
1905
1906<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-02-06T15:19:03-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-283851">2015/02/06</a></time></div>
1907
1908</div>
1909
1910
1911<div class="wp-block-comment-content"><p>[&#8230;] am using the following article from Mike Hillyer as a basis for creating a nested set model for use with comments and comment [&#823
19110;]</p>
1912</div>
1913
1914</div>
1915</div>
1916
1917</li><li id="comment-285069" class="pingback even thread-even depth-1">
1918
1919<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1920<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1921
1922
1923
1924<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.tech.theplayhub.com/count_of_items_by_depth_with_a_nested_set_model/" target="_self" >Count of items by depth with a nested set model &#8211; Technology</a></div>
1925
1926
1927<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-02-27T15:35:09-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-285069">2015/02/27</a></time></div>
1928
1929</div>
1930
1931
1932<div class="wp-block-comment-content"><p>[&#8230;] using the nested set model for my database (from here: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>), it works perfectly, [&#8230;]</p>
1933</div>
1934
1935</div>
1936</div>
1937
1938</li><li id="comment-285389" class="pingback odd alt thread-odd thread-alt depth-1">
1939
1940<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1941<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1942
1943
1944
1945<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://xluat.com/select-products-where-the-category-belongs-to-any-category-in-the-hierarchy/" target="_self" >Select products where the category belongs to any category in the hierarchy | XL-UAT</a></div>
1946
1947
1948<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-03-05T12:21:02-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-285389">2015/03/05</a></time></div>
1949
1950</div>
1951
1952
1953<div class="wp-block-comment-content"><p>[&#8230;] this is at the database design stage. Your categories table needs to be a Nested Set. The article Managing Hierarchical Data in MySQL is not that MySQL specific (despite the title), and gives a great overview of the different methods [&#8230;]</p>
1954</div>
1955
1956</div>
1957</div>
1958
1959</li><li id="comment-285511" class="pingback even thread-even depth-1">
1960
1961<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1962<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1963
1964
1965
1966<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.tech.theplayhub.com/what_are_the_options_for_storing_hierarchical_data_in_a_relational_database/" target="_self" >What are the Options for Storing Hierarchical Data in a Relational Database? &#8211; Technology</a></div>
1967
1968
1969<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-03-08T04:35:04-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-285511">2015/03/08</a></time></div>
1970
1971</div>
1972
1973
1974<div class="wp-block-comment-content"><p>[&#8230;] Representing hierarchies in MySQL: very good overview of Nested Set in particular [&#8230;]</p>
1975</div>
1976
1977</div>
1978</div>
1979
1980</li>
1980<li id="comment-285516" class="pingback odd alt thread-odd thread-alt depth-1">
1981
1982<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
1983<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
1984
1985
1986
1987<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.52sourcecode.com/post-186868.html" target="_self" >MySql Hierarchical Database in Java Web App Jquery Tree | 我爱源码网</a></div>
1988
1989
1990<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-03-08T14:27:06-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-285516">2015/03/08</a></time></div>
1991
1992</div>
1993
1994
1995<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
1996</div>
1997
1998</div>
1999</div>
2000
2001</li><li id="comment-288367" class="comment even thread-even depth-1">
2002
2003<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2004<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Adam Avatar' src='https://secure.gravatar.com/avatar/6106be7a2e3891c8816735cefecec5ea4dc6f9ab4a8e0755ec8ae91b689d9b4d?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6106be7a2e3891c8816735cefecec5ea4dc6f9ab4a8e0755ec8ae91b689d9b4d?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2005
2006
2007
2008<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Adam</div>
2009
2010
2011<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-04-18T21:35:28-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-288367">2015/04/18</a></time></div>
2012
2013</div>
2014
2015
2016<div class="wp-block-comment-content"><p>Hi, I&#8217;ve implemented nsm in my project, thanks to this article.<br />
2017Now I&#8217;m trying to get a simple method of showing all (lets say) products) of given parent category (which can contain many subcategories). Is there any chance to somebody give any tip on how to acheive this?</p>
2018<p>best regards<br />
2019Adam</p>
2020</div>
2021
2022</div>
2023</div>
2024
2025</li><li id="comment-288634" class="comment odd alt thread-odd thread-alt depth-1">
2026
2027<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2028<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Martin F Avatar' src='https://secure.gravatar.com/avatar/84afebd9394441a8c7f8ae84d8866e240a7078629b6572a2da9a6cb89e0c8557?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/84afebd9394441a8c7f8ae84d8866e240a7078629b6572a2da9a6cb89e0c8557?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2029
2030
2031
2032<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Martin F</div>
2033
2034
2035<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-04-22T16:07:14-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-288634">
20352015/04/22</a></time></div>
2036
2037</div>
2038
2039
2040<div class="wp-block-comment-content"><p>Under Retrieving a Single Path, you can/should leave out (excuse the pun) the<br />
2041&#8220;t1.name = &#8216;ELECTRONICS&#8217; AND&#8221;<br />
2042part of the WHERE clause. The query will find the path to the root.</p>
2043</div>
2044
2045</div>
2046</div>
2047
2048</li><li id="comment-288953" class="pingback even thread-even depth-1">
2049
2050<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2051<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2052
2053
2054
2055<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://entwickler.de/online/php/mysql-5-6-4-mit-neuen-performance-schema-eigenschaften-132727.html" target="_self" >MySQL 5.6.4 mit neuen Performance-Schema-Eigenschaften &#8211; entwickler.de</a></div>
2056
2057
2058<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-04-28T07:17:20-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-288953">2015/04/28</a></time></div>
2059
2060</div>
2061
2062
2063<div class="wp-block-comment-content"><p>[&#8230;] Manipulations-Methoden interessiert sind, empfiehlt Marc Alff Mike Hillyers Artikel &#8220;Managing Hierarchical Data in MySQL&#8220;. Die aktuellle Dokumentation des Performance-Schemas findet sich auf [&#8230;]</p>
2064</div>
2065
2066</div>
2067</div>
2068
2069</li><li id="comment-289309" class="comment odd alt thread-odd thread-alt depth-1">
2070
2071<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2072<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Bruno Lebtag Avatar' src='https://secure.gravatar.com/avatar/20d589bd4d060dce12376466b6376049c7a5472ff2738b1b7b80c626c5857e16?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/20d589bd4d060dce12376466b6376049c7a5472ff2738b1b7b80c626c5857e16?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2073
2074
2075
2076<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Bruno Lebtag</div>
2077
2078
2079<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-05-02T13:00:50-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-289309">2015/05/02</a></time></div>
2080
2081</div>
2082
2083
2084<div class="wp-block-comment-content"><p>I tried Retriving a single path and your query didn&#8217;t worked. I changed &#8216;ORDER BY node.lft&#8217; to &#8216;ORDER BY parent.lft&#8217; and worked. My mysql is 5.6.19-1~exp1ubuntu2. Excellent work! thanks a lot.</p>
2085</div>
2086
2087</div>
2088</div>
2089
2090</li><li id="comment-290710" class="pingback even thread-even depth-1">
2091
2092<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2093<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2094
2095
2096
2097<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://dluat.com/nested-set-model-retrieve-sub-tree-containing-nodes-that-match-condition/" target="_self" >Nested set model: retrieve sub-tree containing nodes that match condition | DL-UAT</a></div>
2098
2099
2100<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-05-20T10:18:00-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-290710">2015/05/20</a></time></div>
2101
2102</div>
2103
2104
2105<div class="wp-block-comment-content"><p>[&#8230;] using the &#8220;nested set model&#8221; (the backend used by our web application is CakePHP and the Project model uses the [&#8230;]</p>
2106</div>
2107
2108</div>
2109</div>
2110
2111</li>
2111<li id="comment-292265" class="comment odd alt thread-odd thread-alt depth-1">
2112
2113<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2114<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='tyan4g Avatar' src='https://secure.gravatar.com/avatar/252924c519030231e31c733d121f1e7b5fa8c52e1ce39555e2b31d6b22356534?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/252924c519030231e31c733d121f1e7b5fa8c52e1ce39555e2b31d6b22356534?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2115
2116
2117
2118<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">tyan4g</div>
2119
2120
2121<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-06-16T03:33:10-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-292265">2015/06/16</a></time></div>
2122
2123</div>
2124
2125
2126<div class="wp-block-comment-content"><p>Finding the Depth of the Nodes:<br />
2127SELECT node.name, (COUNT(parent.name) &#8211; 1) AS depth<br />
2128FROM nested_category AS node,<br />
2129        nested_category AS parent<br />
2130WHERE node.lft BETWEEN parent.lft AND parent.rgt<br />
2131GROUP BY node.name<br />
2132ORDER BY node.lft;<br />
2133I find this is problematic, cause if I add two item with the same name will cause the depth got a wrong result..plz help me..</p>
2134</div>
2135
2136</div>
2137</div>
2138
2139</li><li id="comment-292397" class="comment even thread-even depth-1">
2140
2141<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2142<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Andreas Beder Avatar' src='https://secure.gravatar.com/avatar/ef2fa71a4d46c672e1bc563ef5215f3a5e9c97b03bca331b50c8c0353b468921?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ef2fa71a4d46c672e1bc563ef5215f3a5e9c97b03bca331b50c8c0353b468921?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2143
2144
2145
2146<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.moving-bytes.at" target="_self" >Andreas Beder</a></div>
2147
2148
2149<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-06-23T08:06:00-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-292397">2015/06/23</a></time></div>
2150
2151</div>
2152
2153
2154<div class="wp-block-comment-content"><p>Thanks !!!</p>
2155</div>
2156
2157</div>
2158</div>
2159
2160</li><li id="comment-292418" class="pingback odd alt thread-odd thread-alt depth-1">
2161
2162<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2163<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2164
2165
2166
2167<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://dexpage.com/listing-of-all-elements-recursively-through-postgresql/" target="_self" >Listing of all elements recursively through postgresql &#8211; dex page</a></div>
2168
2169
2170<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2015-06-24T09:41:47-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-292418">2015/06/24</a></time></div>
2171
2172</div>
2173
2174
2175<div class="wp-block-comment-content"><p>[&#8230;] found <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>, this is pretty much what I need except my model is [&#8230;]</p>
2176</div>
2177
2178</div>
2179</div>
2180
2181</li>
2181<li id="comment-300891" class="pingback even thread-even depth-1">
2182
2183<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2184<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2185
2186
2187
2188<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://htmlcode.space/adjacency-list-model-vs-nested-set-model-for-mysql-hierarchical-data/" target="_self" >Adjacency List Model vs Nested Set Model for MySQL hierarchical data? &#8211; HTML CODE</a></div>
2189
2190
2191<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-14T03:00:20-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-300891">2016/01/14</a></time></div>
2192
2193</div>
2194
2195
2196<div class="wp-block-comment-content"><p>[&#8230;] there two ways work hierarchy info in mysql: [&#8230;]</p>
2197</div>
2198
2199</div>
2200</div>
2201
2202</li><li id="comment-300917" class="pingback odd alt thread-odd thread-alt depth-1">
2203
2204<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2205<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2206
2207
2208
2209<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://htmlcode.space/laravel-query-builder-returns-empty-array-despite-it-being-not-null/" target="_self" >Laravel Query builder returns empty array despite it being not null &#8211; HTML CODE</a></div>
2210
2211
2212<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-15T11:08:35-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-300917">2016/01/15</a></time></div>
2213
2214</div>
2215
2216
2217<div class="wp-block-comment-content"><p>[&#8230;] on <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
2218</div>
2219
2220</div>
2221</div>
2222
2223</li><li id="comment-300918" class="pingback even thread-even depth-1">
2224
2225<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2226<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2227
2228
2229
2230<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://blogfordevs.esy.es/blogs/?p=13056" target="_self" >Multi level hierarchy relation in flat table design (MySql)</a></div>
2231
2232
2233<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-15T11:40:34-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-300918">2016/01/15</a></time></div>
2234
2235</div>
2236
2237
2238<div class="wp-block-comment-content"><p>[&#8230;] studied Adjacency List, Nested List &amp; Closure table design, but came to conclusion that Session based Adjacency List can be better [&#8230;]</p>
2239</div>
2240
2241</div>
2242</div>
2243
2244</li><li id="comment-301010" class="comment odd alt thread-odd thread-alt depth-1">
2245
2246<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2247<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='David Kaštánek Avatar' src='https://secure.gravatar.com/avatar/86d377b0da46ff539ece75369b506cfe6a28773e58c6e9d3e894451d734460d0?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/86d377b0da46ff539ece75369b506cfe6a28773e58c6e9d3e894451d734460d0?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2248
2249
2250
2251<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">David Kaštánek</div>
2252
2253
2254<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-17T06:20:29-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-301010">2016/01/17</a></time></div>
2255
2256</div>
2257
2258
2259<div class="wp-block-comment-content"><p>Awesome idea! I knew this method existed and after reading this I also know how to implement it. Thank y
2259ou very much 🙂</p>
2260</div>
2261
2262</div>
2263</div>
2264
2265</li><li id="comment-301550" class="comment even thread-even depth-1">
2266
2267<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2268<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='e2xist Avatar' src='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2269
2270
2271
2272<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">e2xist</div>
2273
2274
2275<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-01-28T14:46:08-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-301550">2016/01/28</a></time></div>
2276
2277</div>
2278
2279
2280<div class="wp-block-comment-content"><p>thanks a lot !</p>
2281</div>
2282
2283</div>
2284</div>
2285
2286</li><li id="comment-301762" class="pingback odd alt thread-odd thread-alt depth-1">
2287
2288<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2289<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2290
2291
2292
2293<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.nmtree.net/2016/02/01/options-for-storing-hierarchical-data-in-a-relational-database.html" target="_self" >Options for Storing Hierarchical Data in a Relational Database | 柠檬树博客</a></div>
2294
2295
2296<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-02-01T01:27:31-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-301762">2016/02/01</a></time></div>
2297
2298</div>
2299
2300
2301<div class="wp-block-comment-content"><p>[&#8230;] Representing hierarchies in MySQL: very good overview of Nested Set in particular [&#8230;]</p>
2302</div>
2303
2304</div>
2305</div>
2306
2307</li><li id="comment-301898" class="comment even thread-even depth-1">
2308
2309<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2310<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='ummmmm Avatar' src='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2311
2312
2313
2314<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">ummmmm</div>
2315
2316
2317<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-02-09T16:09:23-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-301898">2016/02/09</a></time></div>
2318
2319</div>
2320
2321
2322<div class="wp-block-comment-content"><p>Finding the Depth of the Nodes,</p>
2323<p>select<br />
2324node.id as id,<br />
2325node.lft as lft,node.rgt as rgt,<br />
2326parent.id as top_parent_id,<br />
2327(count(parent.id)-1) as depth<br />
2328FROM<br />
2329nested_category as parent_ctl,<br />
2330nested_category as parent,<br />
2331nested_category as node<br />
2332where<br />
2333parent.lft between parent_ctl.lft and parent_ctl.rgt<br />
2334and node.lft between parent.lft and parent.rgt<br />
2335and parent_ctl.id = ?<br />
2336group by node.id<br />
2337order by node.lft</p>
2338<p>* title -&gt; id</p>
2339</div>
2340
2341</div>
2342</div>
2343
2344</li><li id="comment-302059" class="pingback odd alt thread-odd thread-alt depth-1">
2345
2346<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2347<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2348
2349
2350
2351<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://techabcto.xyz/2008/08/30/designing-a-threaded-commenting-system-answered/" target="_self" >Designing a threaded commenting system [ANSWERED] &#8211; Tech ABC to XYZ</a></div>
2352
2353
2354<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-02-19T23:05:45-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302059">2016/02/19</a></time></div>
2355
2356</div>
2357
2358
2359<div class="wp-block-comment-content"><p>[&#8230;] This website lists some common techniques: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
2360</div>
2361
2362</div>
2363</div>
2364
2365</li><li id="comment-302133" class="comment even thread-even depth-1">
2366
2367<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2368<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Wojciech Glapa Avatar' src='https://secure.gravatar.com/avatar/73eeee964c37184f45fad2cfbf7043141e165674a985169541609dc79d791ca7?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/73eeee964c37184f45fad2cfbf7043141e165674a985169541609dc79d791ca7?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2369
2370
2371
2372<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Wojciech Glapa</div>
2373
2374
2375<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-02-23T04:41:37-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302133">2016/02/23</a></time></div>
2376
2377</div>
2378
2379
2380<div class="wp-block-comment-content"><p>Very usefull, thanks.</p>
2381</div>
2382
2383</div>
2384</div>
2385
2386</li><li id="comment-302212" class="comment odd alt thread-odd thread-alt depth-1">
2387
2388<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2389<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Thomas Avatar' src='https://secure.gravatar.com/avatar/c3c4939551510d33d94c32aaf65c36ec4a931cf69c9a532294670c58ed07a35f?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c3c4939551510d33d94c32aaf65c36ec4a931cf69c9a532294670c58ed07a35f?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2390
2391
2392
2393<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Thomas</div>
2394
2395
2396<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-03-01T07:26:59-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302212">2016/03/01</a></time></div>
2397
2398</div>
2399
2400
2401<div class="wp-block-comment-content"><p>Man, you save our lives. Thanks so much! Nice job and was the best tutorial about this issue. Best regards</p>
2402</div>
2403
2404</div>
2405</div>
2406
2407</li>
2407<li id="comment-302256" class="comment even thread-even depth-1">
2408
2409<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2410<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Sagar Khandelwal Avatar' src='https://secure.gravatar.com/avatar/d11a99dd7f081d71d56bc6a7f13a9231ed7354b9bc682bd900542920cfa8fbb4?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d11a99dd7f081d71d56bc6a7f13a9231ed7354b9bc682bd900542920cfa8fbb4?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2411
2412
2413
2414<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://anshrpr.com" target="_self" >Sagar Khandelwal</a></div>
2415
2416
2417<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-03-04T03:24:38-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302256">2016/03/04</a></time></div>
2418
2419</div>
2420
2421
2422<div class="wp-block-comment-content"><p>Insert a new node<br />
2423&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
2424LOCK TABLE nested_category WRITE;</p>
2425<p>SELECT @myRight := rgt FROM nested_category<br />
2426WHERE name = &#8216;TELEVISIONS&#8217;;</p>
2427<p>UPDATE nested_category SET rgt = rgt + 2 WHERE rgt &gt; @myRight;<br />
2428UPDATE nested_category SET lft = lft + 2 WHERE lft &gt; @myRight;</p>
2429<p>INSERT INTO nested_category(name, lft, rgt) VALUES(&#8216;GAME CONSOLES&#8217;, @myRight + 1, @myRight + 2);</p>
2430<p>UNLOCK TABLES;<br />
2431&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
2432This gives Game Console left=10 and right = 11, while right of Television remains 9. Resulting a corrupted tree.</p>
2433<p>Instead, you can select @myRight := rgt &#8211; 1, and rest of the query would work fine.</p>
2434<p>Regards</p>
2435</div>
2436
2437</div>
2438</div>
2439
2440</li><li id="comment-302519" class="comment odd alt thread-odd thread-alt depth-1">
2441
2442<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2443<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Zhong chaojun Avatar' src='https://secure.gravatar.com/avatar/f634df3c638cc159a32cb91b7bc30b69b774b83fff766046e33a581700ed7c08?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f634df3c638cc159a32cb91b7bc30b69b774b83fff766046e33a581700ed7c08?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2444
2445
2446
2447<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Zhong chaojun</div>
2448
2449
2450<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-03-14T04:35:33-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302519">2016/03/14</a></time></div>
2451
2452</div>
2453
2454
2455<div class="wp-block-comment-content"><p>In section RETRIEVING A SINGLE PATH, order by parent.lft not node.lft</p>
2456</div>
2457
2458</div>
2459</div>
2460
2461</li><li id="comment-302992" class="comment even thread-even depth-1">
2462
2463<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2464<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Carl Sanders Avatar' src='https://secure.gravatar.com/avatar/b3b5e6a24227f065ce0404aea46994794792b6fbcab17cd476c29f20a0f76b7c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b3b5e6a24227f065ce0404aea46994794792b6fbcab17cd476c29f20a0f76b7c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2465
2466
2467
2468<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.transglobalmegacorp.co.uk" target="_self" >Carl Sanders</a></div>
2469
2470
2471<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-03-23T08:02:12-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-302992">2016/03/23</a></time></div>
2472
2473</div>
2474
2475
2476<div class="wp-block-comment-content"><p>Fantastic article Mike!</p>
2477<p>There is a further improvement to this model where you store the depth with each node.  That makes querying for sub-trees and adjacent entities far simpler.  In symphony there is a nested set library available for doctrine (which I have used) and there&#8217;s also a php lib called Boabab (which I haven&#8217;t).</p>
2478</div>
2479
2480</div>
2481</div>
2482
2483</li>
2483<li id="comment-304010" class="comment odd alt thread-odd thread-alt depth-1">
2484
2485<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2486<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Programmer Avatar' src='https://secure.gravatar.com/avatar/3f3f3af7f4a8c6db37caf382bef15447c7f2c9a506a32d7a9d326a568b0f9707?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3f3f3af7f4a8c6db37caf382bef15447c7f2c9a506a32d7a9d326a568b0f9707?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2487
2488
2489
2490<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Programmer</div>
2491
2492
2493<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-04-11T07:06:23-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-304010">2016/04/11</a></time></div>
2494
2495</div>
2496
2497
2498<div class="wp-block-comment-content"><p>Great article.</p>
2499<p>How to move a node?</p>
2500</div>
2501
2502</div>
2503</div>
2504
2505</li><li id="comment-304607" class="comment even thread-even depth-1">
2506
2507<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2508<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Vahid Avatar' src='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2509
2510
2511
2512<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Vahid</div>
2513
2514
2515<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-05-08T05:30:07-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-304607">2016/05/08</a></time></div>
2516
2517</div>
2518
2519
2520<div class="wp-block-comment-content"><p>Thanks for this awesome article. It shows the deep of concepts which author obtained. Bravo<br />
2521There&#8217;s a question i&#8217;m thinking about it:</p>
2522<p>How we can build a lft,rgt type (The Nested Set) tree with an Adjacency List tree which already we have?</p>
2523<p>imagine there&#8217;s a table : id,parent_id,title with 500000 or more records.<br />
2524How can convert this table?</p>
2525<p>Regards.</p>
2526</div>
2527
2528</div>
2529</div>
2530
2531<ol><li id="comment-304644" class="comment odd alt depth-2">
2532
2533<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2534<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Vahid Avatar' src='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2535
2536
2537
2538<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Vahid</div>
2539
2540
2541<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-05-09T00:41:57-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-304644">2016/05/09</a></time></div>
2542
2543</div>
2544
2545
2546<div class="wp-block-comment-content"><p>I found this great soloution:<br />
2547<a href="http://dba.stackexchange.com/questions/89051/stored-procedure-to-update-an-adjacency-model-to-nested-sets-model" rel="nofollow ugc">http://dba.stackexchange.com/questions/89051/stored-procedure-to-update-an-adjacency-model-to-nested-sets-model</a></p>
2548</div>
2549
2550</div>
2551</div>
2552
2553</li></ol></li>
2553<li id="comment-304856" class="comment even thread-odd thread-alt depth-1">
2554
2555<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2556<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Jeff Avatar' src='https://secure.gravatar.com/avatar/8d2e43a8174bf7108548f73bc6fc356836bfbc837e993ac8bad23a397ebac6a8?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8d2e43a8174bf7108548f73bc6fc356836bfbc837e993ac8bad23a397ebac6a8?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2557
2558
2559
2560<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://programacaoelinux.com.br" target="_self" >Jeff</a></div>
2561
2562
2563<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-05-16T09:21:26-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-304856">2016/05/16</a></time></div>
2564
2565</div>
2566
2567
2568<div class="wp-block-comment-content"><p>First thank you for the post, it&#8217;s really helpful. I have a question, maybe a silly one, but in case I have two parents, for instance, following your reasoning, suppose we have Electronics and Home appliance as the topmost parents,  so this model would work the same? Just adding another topmost category as NULL? Tks in advance.</p>
2569</div>
2570
2571</div>
2572</div>
2573
2574<ol><li id="comment-304858" class="comment odd alt depth-2">
2575
2576<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2577<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mike Hillyer Avatar' src='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2578
2579
2580
2581<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://mikehillyer.com/about-me/" target="_self" >Mike Hillyer</a></div>
2582
2583
2584<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-05-16T09:49:48-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-304858">2016/05/16</a></time></div>
2585
2586</div>
2587
2588
2589<div class="wp-block-comment-content"><p>Yes, you will have an un-displayed parent, and the first two children are Electronics and Home.</p>
2590</div>
2591
2592</div>
2593</div>
2594
2595</li></ol></li><li id="comment-305296" class="pingback even thread-even depth-1">
2596
2597<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2598<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2599
2600
2601
2602<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://web-und-die-welt.de/2015/07/angularjs-rekursive-templates/" target="_self" >AngularJS: Rekursive Templates &mdash; Web und die Welt</a></div>
2603
2604
2605<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-06-04T08:08:23-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-305296">2016/06/04</a></time></div>
2606
2607</div>
2608
2609
2610<div class="wp-block-comment-content"><p>[&#8230;] werden. Stattdessen lässt sich zum Beispiel das &#8222;Nested Set Model&#8220; verwenden. Dieser Beitrag beschreibt sehr schön das &#8222;Nested Set Modell&#8220; (englisch). Bei fokus² haben wir noch die rekursive Variante implementiert, da ich aufgrund der Erfahrung [&#823
26100;]</p>
2611</div>
2612
2613</div>
2614</div>
2615
2616</li><li id="comment-305413" class="comment odd alt thread-odd thread-alt depth-1">
2617
2618<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2619<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Amit kumar Avatar' src='https://secure.gravatar.com/avatar/e8b551af79a8804b1bfd46412a332d3f02edaf9daae5239efb73d73fc38d572a?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e8b551af79a8804b1bfd46412a332d3f02edaf9daae5239efb73d73fc38d572a?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2620
2621
2622
2623<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://dbinfoweb.com" target="_self" >Amit kumar</a></div>
2624
2625
2626<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-06-09T03:31:40-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-305413">2016/06/09</a></time></div>
2627
2628</div>
2629
2630
2631<div class="wp-block-comment-content"><p>I want to make a single query that works multiple child level<br />
2632and i want to this with single sql query</p>
2633<p>Thankyou.</p>
2634</div>
2635
2636</div>
2637</div>
2638
2639</li><li id="comment-305676" class="pingback even thread-even depth-1">
2640
2641<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2642<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2643
2644
2645
2646<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://cyberkrul.wordpress.com/2016/06/24/managing-hierarchical-data/" target="_self" >Managing Hierarchical data &#8230; &#8211; cyberkrul</a></div>
2647
2648
2649<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-06-24T04:51:09-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-305676">2016/06/24</a></time></div>
2650
2651</div>
2652
2653
2654<div class="wp-block-comment-content"><p>[&#8230;] Great article &#8230; [&#8230;]</p>
2655</div>
2656
2657</div>
2658</div>
2659
2660</li><li id="comment-305814" class="comment odd alt thread-odd thread-alt depth-1">
2661
2662<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2663<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='bhavin Avatar' src='https://secure.gravatar.com/avatar/4f3ccbaa4013e45f0d5be33c07e9eee5646998baafa91d832b38faa60724b1ed?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4f3ccbaa4013e45f0d5be33c07e9eee5646998baafa91d832b38faa60724b1ed?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2664
2665
2666
2667<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">bhavin</div>
2668
2669
2670<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-07-02T05:21:01-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-305814">2016/07/02</a></time></div>
2671
2672</div>
2673
2674
2675<div class="wp-block-comment-content"><p>Thank you so..much for this great blog. Awesome explanation. You are clear my concept of parent , child structure in 2 hours.</p>
2676</div>
2677
2678</div>
2679</div>
2680
2681</li>
2681<li id="comment-305883" class="pingback even thread-even depth-1">
2682
2683<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2684<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2685
2686
2687
2688<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.codeba.cc/mysql-tree.html" target="_self" >MySQL: Tree | Codeba</a></div>
2689
2690
2691<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-07-05T17:19:44-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-305883">2016/07/05</a></time></div>
2692
2693</div>
2694
2695
2696<div class="wp-block-comment-content"><p>[&#8230;] is a detailed explanation. Unfortunately the article on mysql.com is does not exist any [&#8230;]</p>
2697</div>
2698
2699</div>
2700</div>
2701
2702</li><li id="comment-306103" class="comment odd alt thread-odd thread-alt depth-1">
2703
2704<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2705<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Amit Avatar' src='https://secure.gravatar.com/avatar/1c99d3b34b8bc6daf79be6b258eca314596849c405436232db65c6c62ff959fb?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c99d3b34b8bc6daf79be6b258eca314596849c405436232db65c6c62ff959fb?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2706
2707
2708
2709<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Amit</div>
2710
2711
2712<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-07-20T01:29:02-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306103">2016/07/20</a></time></div>
2713
2714</div>
2715
2716
2717<div class="wp-block-comment-content"><p>Is it possible to use the nested set model with intersecting sets? For example, if there is a Portable Television, so it should be a shared child between Television and Portable Electronics. Can the nested set model be applied to such a case?</p>
2718</div>
2719
2720</div>
2721</div>
2722
2723<ol><li id="comment-306437" class="comment even depth-2">
2724
2725<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2726<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Mike Hillyer Avatar' src='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2727
2728
2729
2730<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://mikehillyer.com/about-me/" target="_self" >Mike Hillyer</a></div>
2731
2732
2733<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-08-08T11:46:04-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306437">2016/08/08</a></time></div>
2734
2735</div>
2736
2737
2738<div class="wp-block-comment-content"><p>Keep the data on the television in a separate table, and put the primary key of the television in the nested set under television and under portable electronics.<
2738/p>
2739</div>
2740
2741</div>
2742</div>
2743
2744</li></ol></li><li id="comment-306172" class="pingback odd alt thread-even depth-1">
2745
2746<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2747<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2748
2749
2750
2751<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://find24.wordpress.com/2016/07/22/storing-hierarchical-data-in-a-relational-database/" target="_self" >Storing Hierarchical Data in a Relational Database | find24</a></div>
2752
2753
2754<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-07-22T08:43:42-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306172">2016/07/22</a></time></div>
2755
2756</div>
2757
2758
2759<div class="wp-block-comment-content"><p>[&#8230;] Representing hierarchies in MySQL: very good overview of Nested Set in particular [&#8230;]</p>
2760</div>
2761
2762</div>
2763</div>
2764
2765</li><li id="comment-306610" class="pingback even thread-odd thread-alt depth-1">
2766
2767<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2768<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2769
2770
2771
2772<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://mubashshir.com/blog/2014/10/15/managing-hierarchical-data-in-mysql-mike-hillyers-personal-webspace-2/" target="_self" >Managing Hierarchical Data in MySQL | Mike Hillyer&#8217;s Personal Webspace &#8211; MUBASHSHIR ZAKIR</a></div>
2773
2774
2775<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-08-21T09:15:33-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306610">2016/08/21</a></time></div>
2776
2777</div>
2778
2779
2780<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
2781</div>
2782
2783</div>
2784</div>
2785
2786</li><li id="comment-306622" class="comment odd alt thread-even depth-1">
2787
2788<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2789<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Reinaldo Avatar' src='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2790
2791
2792
2793<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Reinaldo</div>
2794
2795
2796<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-08-22T11:34:40-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306622">2016/08/22</a></time></div>
2797
2798</div>
2799
2800
2801<div class="wp-block-comment-content"><p>I think it would be easy to make a hierarchical table if the DBMS 
2801implement a numeric data type as a software version, eg.: 1.3.7.25, so we could use this type to do a column &#8220;Hierarchy&#8221;, where the first node would be the 1, her first child would be 1.1, his second child 1.2 , the first child of the first child would be 1.1.1, the second child of the first child would be 1.1.2 and so on. To insert correctly in the hierarchy just think in trigger to do it. To delete we could use the &#8220;Hierarchy&#8221; column to remove a parent and all its children.</p>
2802<p>PS.: It is just a initial idea.</p>
2803</div>
2804
2805</div>
2806</div>
2807
2808<ol><li id="comment-306633" class="comment even depth-2">
2809
2810<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2811<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Reinaldo Avatar' src='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2812
2813
2814
2815<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Reinaldo</div>
2816
2817
2818<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-08-23T07:06:54-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306633">2016/08/23</a></time></div>
2819
2820</div>
2821
2822
2823<div class="wp-block-comment-content"><p>In addition; To get the resultset hierarchically  just order by &#8220;hierarchy&#8221;.<br />
2824Clean, easy and graceful.</p>
2825</div>
2826
2827</div>
2828</div>
2829
2830</li></ol></li><li id="comment-306788" class="comment odd alt thread-odd thread-alt depth-1">
2831
2832<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2833<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='paola Avatar' src='https://secure.gravatar.com/avatar/9a62120e40b6beb795a80f992380ed55714d70f9a28a3ea553fad79fd22cdb2b?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9a62120e40b6beb795a80f992380ed55714d70f9a28a3ea553fad79fd22cdb2b?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2834
2835
2836
2837<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">paola</div>
2838
2839
2840<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-09-01T16:15:24-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306788">2016/09/01</a></time></div>
2841
2842</div>
2843
2844
2845<div class="wp-block-comment-content"><p>very good, realy helpful</p>
2846<p>thank you</p>
2847</div>
2848
2849</div>
2850</div>
2851
2852</li><li id="comment-306909" class="comment even thread-even depth-1">
2853
2854<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2855<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Sergey Avatar' src='https://secure.gravatar.com/avatar/69f87cb9e45237c13bdc332cd73b2b9a701e9956617bf576b2e1d79095a3f474?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/69f87cb9e45237c13bdc332cd73b2b9a701e9956617bf576b2e1d79095a3f474?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2856
2857
2858
2859<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Sergey</div>
2860
2861
2862<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-09-09T08:24:15-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-306909">2016/09/09</a></time></div>
2863
2864</div>
2865
2866
2867<div class="wp-block-comment-content"><p>Really useful article, thank you so much!</p>
2868</div>
2869
2870</div>
2871</div>
2872
2873</li>
2873<li id="comment-307550" class="comment odd alt thread-odd thread-alt depth-1">
2874
2875<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2876<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Aman Singh Avatar' src='https://secure.gravatar.com/avatar/299b16c0cd7cfb73b6bbd3fb601b3003b95f56c339497384a8338aca14234d70?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/299b16c0cd7cfb73b6bbd3fb601b3003b95f56c339497384a8338aca14234d70?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2877
2878
2879
2880<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Aman Singh</div>
2881
2882
2883<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-11-03T05:06:01-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-307550">2016/11/03</a></time></div>
2884
2885</div>
2886
2887
2888<div class="wp-block-comment-content"><p>You can get calculated columns parent &amp; depth with following query:<br />
2889SELECT node.category_id, node.name,<br />
2890  node.lft, node.rgt,<br />
2891  (select parent.category_id from nested_category AS parent<br />
2892  WHERE node.lft BETWEEN parent.lft AND parent.rgt<br />
2893  ORDER BY parent.rgt offset 1 limit 1) AS parent,<br />
2894  (select (COUNT(parent.name) &#8211; 1) from nested_category AS parent<br />
2895  WHERE node.lft BETWEEN parent.lft AND parent.rgt) as depth<br />
2896FROM nested_category AS node;</p>
2897</div>
2898
2899</div>
2900</div>
2901
2902</li><li id="comment-310079" class="comment even thread-even depth-1">
2903
2904<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2905<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Siah Avatar' src='https://secure.gravatar.com/avatar/cfa40606dfef33b9a0aba2da07d6910104f19da4f1892e76d05f7ee0121245b9?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/cfa40606dfef33b9a0aba2da07d6910104f19da4f1892e76d05f7ee0121245b9?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2906
2907
2908
2909<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://siahgumeshargh.com/" target="_self" >Siah</a></div>
2910
2911
2912<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2016-12-27T12:46:09-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-310079">2016/12/27</a></time></div>
2913
2914</div>
2915
2916
2917<div class="wp-block-comment-content"><p>This is great article. I&#8217;m going develop an ORM that will handle nested sets and hide the complexities. Unfortunately most ORMs do no support nested sets and typing all the necessary SQL for managing nested sets in every project that needs this feature is a nightmare.</p>
2918</div>
2919
2920</div>
2921</div>
2922
2923</li><li id="comment-310199" class="pingback odd alt thread-odd thread-alt depth-1">
2924
2925<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2926<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2927
2928
2929
2930<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://natethedba.wordpress.com/2016/12/22/the-nested-set-model/" target="_self" >The Nested Set Model &#8211; nate_the_dba</a></div>
2931
2932
2933<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-01-01T20:05:00-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-310199">2017/01/01</a></time></div>
2934
2935</div>
2936
2937
2938<div class="wp-block-comment-content"><p>[&#8230;] are probably definitely several articles out there which cover the SQL implementation of the Nested Set Model, aka &#8220;modified [&#8230;]</p>
2939</div>
2940
2941</div>
2942</div>
2943
2944</li>
2944<li id="comment-310475" class="comment even thread-even depth-1">
2945
2946<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2947<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='egoing Avatar' src='https://secure.gravatar.com/avatar/9907d87b42515e4df78923a6bf48278750798e43adf2bf087224bf2775023486?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9907d87b42515e4df78923a6bf48278750798e43adf2bf087224bf2775023486?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
2948
2949
2950
2951<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">egoing</div>
2952
2953
2954<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-01-26T22:07:19-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-310475">2017/01/26</a></time></div>
2955
2956</div>
2957
2958
2959<div class="wp-block-comment-content"><p>Thank you. Great article. </p>
2960<p>I think this is more easy to read. 🙂 </p>
2961<p>SET @SUB_TREE_NAME = &#8216;TELEVISIONS&#8217;;<br />
2962SET @LFT = (SELECT lft<br />
2963            FROM nested_category<br />
2964            WHERE name = @SUB_TREE_NAME);<br />
2965SET @RGT = (SELECT RGT<br />
2966            FROM nested_category<br />
2967            WHERE name = @SUB_TREE_NAME);<br />
2968SET @SUB_TREE_DEPTH = (<br />
2969  SELECT COUNT(node.category_id) &#8211; 1<br />
2970  FROM<br />
2971    nested_category AS node<br />
2972    INNER JOIN<br />
2973    nested_category AS parent<br />
2974      ON<br />
2975        node.lft BETWEEN parent.lft AND parent.rgt<br />
2976  WHERE node.name = @SUB_TREE_NAME<br />
2977  GROUP BY node.category_id<br />
2978);<br />
2979SELECT<br />
2980  *,<br />
2981  (COUNT(node.category_id) &#8211; @SUB_TREE_DEPTH &#8211; 1) AS depth<br />
2982FROM nested_category AS node LEFT JOIN nested_category AS parent ON node.lft BETWEEN parent.lft AND parent.rgt<br />
2983WHERE node.lft BETWEEN @LFT AND @RGT<br />
2984GROUP BY node.category_id<br />
2985ORDER BY node.lft;</p>
2986</div>
2987
2988</div>
2989</div>
2990
2991</li><li id="comment-310718" class="pingback odd alt thread-odd thread-alt depth-1">
2992
2993<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
2994<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
2995
2996
2997
2998<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.dataarchitect.cloud/converting-comma-separated-fields-to-mysql-json-a-case-study/" target="_self" >Converting comma separated fields to MySQL JSON – a case study &#8211; Cloud Data Architect</a></div>
2999
3000
3001<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-02-23T03:20:15-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-310718">2017/02/23</a></time></div>
3002
3003</div>
3004
3005
3006<div class="wp-block-comment-content"><p>[&#8230;] are many ways to store a tree in a relational database, this is not by far the best option to do it, however it is still common to see it [&#8230;]</p>
3007</div>
3008
3009</div>
3010</div>
3011
3012</li><li id="comment-311220" class="pingback even thread-even depth-1">
3013
3014<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3015<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3016
3017
3018
3019<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://hack.hk.cn/2017/03/27/%e5%9f%9f%e5%90%8d%e6%9b%b4%e6%8d%a2%e9%80%9a%e7%9f%a5/" target="_self" >域名更换通知 &#8211; 莹莹之色</a></div>
3020
3021
3022<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-03-26T20:09:09-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-311220">2017/03/26</a></time></div>
3023
3024</div>
3025
3026
3027<div class="wp-block-comment-content"><p>[&#8230;] 原文地址 ,原文中 Hierarchical Data 直译为 分层结构 ,这里我翻译成 树状结构 。 [&#8230;]</p>
3028</div>
3029
3030</div>
3031</div>
3032
3033</li>
3033<li id="comment-311843" class="pingback odd alt thread-odd thread-alt depth-1">
3034
3035<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3036<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3037
3038
3039
3040<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://ekreative-wp.oleg.ekreative.com/tree-structure-in-relational-dbs-theory-and-use-in-symfony/" target="_self" >Tree structure in relational db&#8217;s: theory and use in Symfony &#8211; Ekreative</a></div>
3041
3042
3043<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-04-18T23:18:58-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-311843">2017/04/18</a></time></div>
3044
3045</div>
3046
3047
3048<div class="wp-block-comment-content"><p>[&#8230;] of them, but if you’re interested in a more detailed explanation of the different models, I found this post very helpful for understanding the adjacency list and nested set models and the following articles [&#8230;]</p>
3049</div>
3050
3051</div>
3052</div>
3053
3054</li><li id="comment-312119" class="pingback even thread-even depth-1">
3055
3056<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3057<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3058
3059
3060
3061<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.codingblog.cn/blog/66165.html" target="_self" >如何创建一个MySQL分层递归查询 &#8211; CodingBlog</a></div>
3062
3063
3064<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-05-22T13:31:18-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-312119">2017/05/22</a></time></div>
3065
3066</div>
3067
3068
3069<div class="wp-block-comment-content"><p>[&#8230;] From the blog Managing Hierarchical Data in MySQL [&#8230;]</p>
3070</div>
3071
3072</div>
3073</div>
3074
3075</li><li id="comment-312158" class="pingback odd alt thread-odd thread-alt depth-1">
3076
3077<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3078<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3079
3080
3081
3082<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://www.codingblog.cn/blog/90449.html" target="_self" >最佳树结构 &#8211; CodingBlog</a></div>
3083
3084
3085<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-05-28T01:13:35-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-312158">2017/05/28</a></time></div>
3086
3087</div>
3088
3089
3090<div class="wp-block-comment-content"><p>[&#8230;] can use a Nested Set Model as it yields very efficient queries. Check out Managing Hierarchical Data in MySQL and read the section called Nested Set [&#8230;]</p>
3091</div>
3092
3093</div>
3094</div>
3095
3096</li><li id="comment-312455" class="pingback even thread-even depth-1">
3097
3098<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3099<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3100
3101
3102
3103<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://www.yinli.org/it/data/mysql/142240.html" target="_self" >MySQL: Tree-Hierarchical query &#8211; 功夫 熊猫 &#8211; &ndash; 引力一族</a></div>
3104
3105
3106<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-06-28T21:14:38-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-312455">
31062017/06/28</a></time></div>
3107
3108</div>
3109
3110
3111<div class="wp-block-comment-content"><p>[&#8230;] is a detailed explanation. Unfortunately the article on mysql.com is does not exist any [&#8230;]</p>
3112</div>
3113
3114</div>
3115</div>
3116
3117</li><li id="comment-313019" class="pingback odd alt thread-odd thread-alt depth-1">
3118
3119<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3120<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3121
3122
3123
3124<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://nppsatek.com/blogs/2015/12/09/%d0%b4%d0%b5%d1%80%d0%b5%d0%b2%d1%8c%d1%8f-%d0%b2-%d0%b1%d0%b4/" target="_self" >Деревья в БД &#8212; КОРПОРАТИВНЫЙ БЛОГ САТЭК</a></div>
3125
3126
3127<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-08-21T12:10:46-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-313019">2017/08/21</a></time></div>
3128
3129</div>
3130
3131
3132<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3133</div>
3134
3135</div>
3136</div>
3137
3138</li><li id="comment-313532" class="comment even thread-even depth-1">
3139
3140<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3141<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"><img alt='Anjum Rizwi Avatar' src='https://secure.gravatar.com/avatar/8d4c0d94acba8c22566f9b407947399a66f5cc097796f26c4aac49de5a742e29?s=40&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8d4c0d94acba8c22566f9b407947399a66f5cc097796f26c4aac49de5a742e29?s=80&#038;d=mm&#038;r=g 2x' class='avatar avatar-40 photo wp-block-avatar__image' height='40' width='40'  style="border-radius:20px;" loading='lazy' decoding='async'/></div></div>
3142
3143
3144
3145<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name">Anjum Rizwi</div>
3146
3147
3148<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-09-20T01:05:44-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-313532">2017/09/20</a></time></div>
3149
3150</div>
3151
3152
3153<div class="wp-block-comment-content"><p>Very useful, as I heard first time about &#8220;lft&#8221; &amp; &#8220;rgt&#8221;.<br />
3154Very good detail articles especially diagram that cleared my doubt</p>
3155</div>
3156
3157</div>
3158</div>
3159
3160</li><li id="comment-313949" class="pingback odd alt thread-odd thread-alt depth-1">
3161
3162<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3163<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3164
3165
3166
3167<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://www.chengxulvtu.com/2016/02/01/options-for-storing-hierarchical-data-in-a-relational-database.html" target="_self" >Options for Storing Hierarchical Data in a Relational Database &#8211; 程序旅途</a></div>
3168
3169
3170<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-10-16T02:05:25-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-313949">
31702017/10/16</a></time></div>
3171
3172</div>
3173
3174
3175<div class="wp-block-comment-content"><p>[&#8230;] Representing hierarchies in MySQL: very good overview of Nested Set in particular [&#8230;]</p>
3176</div>
3177
3178</div>
3179</div>
3180
3181</li><li id="comment-314229" class="pingback even thread-even depth-1">
3182
3183<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3184<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3185
3186
3187
3188<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://exceptionshub.com/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any-depth.html" target="_self" >Is it possible to query a tree structure table in MySQL in a single query, to any depth? &#8211; ExceptionsHub</a></div>
3189
3190
3191<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-11-01T07:12:18-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-314229">2017/11/01</a></time></div>
3192
3193</div>
3194
3195
3196<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3197</div>
3198
3199</div>
3200</div>
3201
3202</li><li id="comment-314230" class="pingback odd alt thread-odd thread-alt depth-1">
3203
3204<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3205<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3206
3207
3208
3209<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://exceptionshub.com/is-it-a-good-idea-to-use-mysql-and-neo4j-together.html" target="_self" >Is it a good idea to use MySQL and Neo4j together? &#8211; ExceptionsHub</a></div>
3210
3211
3212<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-11-01T08:02:15-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-314230">2017/11/01</a></time></div>
3213
3214</div>
3215
3216
3217<div class="wp-block-comment-content"><p>[&#8230;] One is the classic but rather mindbending nested sets. [&#8230;]</p>
3218</div>
3219
3220</div>
3221</div>
3222
3223</li><li id="comment-314746" class="pingback even thread-even depth-1">
3224
3225<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3226<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3227
3228
3229
3230<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://questionfocus.com/php-mysql-best-tree-structure.html" target="_self" >php / Mysql best tree structure &#8211; QuestionFocus</a></div>
3231
3232
3233<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-12-16T19:07:29-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-314746">2017/12/16</a></time></div>
3234
3235</div>
3236
3237
3238<div class="wp-block-comment-content"><p>[&#8230;] can use a Nested Set Model as it yields very efficient queries. Check out Managing Hierarchical Data in MySQL and read the section called Nested Set [&#8230;]</p>
3239</div>
3240
3241</div>
3242</div>
3243
3244</li><li id="comment-314747" class="pingback odd alt thread-odd thread-alt depth-1">
3245
3246<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3247<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3248
3249
3250
3251<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://questionfocus.com/build-a-tree-from-a-flat-array-in-php.html" target="_self" >Build a tree from a flat array in PHP &#8211; QuestionFocus</a></div>
3252
3253
3254<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-12-16T19:16:36-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-314747">2017/12/16</a></time></div>
3255
3256</div>
3257
3258
3259<div class="wp-block-comment-content"><p>[&#8230;] This link should help you out: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3260</div>
3261
3262</div>
3263</div>
3264
3265</li>
3265<li id="comment-314750" class="pingback even thread-even depth-1">
3266
3267<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3268<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3269
3270
3271
3272<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://preparingforcodinginterview.wordpress.com/2017/12/18/managing-hierarchical-data-in-mysql/" target="_self" >Managing Hierarchical Data in MySQL &#8211; Lets Code</a></div>
3273
3274
3275<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2017-12-17T23:13:48-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-314750">2017/12/17</a></time></div>
3276
3277</div>
3278
3279
3280<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3281</div>
3282
3283</div>
3284</div>
3285
3286</li><li id="comment-315174" class="pingback odd alt thread-odd thread-alt depth-1">
3287
3288<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3289<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3290
3291
3292
3293<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="http://msqlserver.com/reverse-query-for-hierarchical-data.html" target="_self" >Reverse query for Hierarchical Data MS SQL Server</a></div>
3294
3295
3296<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2018-01-29T07:52:46-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-315174">2018/01/29</a></time></div>
3297
3298</div>
3299
3300
3301<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3302</div>
3303
3304</div>
3305</div>
3306
3307</li><li id="comment-315635" class="pingback even thread-even depth-1">
3308
3309<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3310<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3311
3312
3313
3314<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://mysqlquestions.com/2018/02/23/recursive-sql-query-on-nested-set-tree-with-stop-condition/" target="_self" >Recursive SQL query on nested-set tree with stop condition &#8211; Mysql Questions</a></div>
3315
3316
3317<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2018-02-24T01:28:03-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-315635">2018/02/24</a></time></div>
3318
3319</div>
3320
3321
3322<div class="wp-block-comment-content"><p>[&#8230;] I am using a nested-set tree structure in a table. The concept is described here. [&#8230;]</p>
3323</div>
3324
3325</div>
3326</div>
3327
3328</li><li id="comment-323324" class="pingback odd alt thread-odd thread-alt depth-1">
3329
3330<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3331<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3332
3333
3334
3335<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://bugsfixing.com/solved-adjacency-list-vs-nested-set-model/" target="_self" >[SOLVED] Adjacency list vs. nested set model &#8211; BugsFixing</a></div>
3336
3337
3338<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-04-27T10:45:30-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323324">2022/04/27</a></time></div>
3339
3340</div>
3341
3342
3343<div class="wp-block-comment-content"><p>[&#8230;] this article: Managing Hierarchical Data in MySQL. It will give you a good starting point on how to implement the various [&#8230;]</p>
3344</div>
3345
3346</div>
3347</div>
3348
3349</li>
3349<li id="comment-323388" class="pingback even thread-even depth-1">
3350
3351<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3352<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3353
3354
3355
3356<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://educationcareerblog.com/sql-designing-a-threaded-commenting-system-education-career-blog/" target="_self" >sql &#8211; Designing a threaded commenting system &#8211; Education Career Blog | Education Career Blog</a></div>
3357
3358
3359<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-05-27T22:04:30-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323388">2022/05/27</a></time></div>
3360
3361</div>
3362
3363
3364<div class="wp-block-comment-content"><p>[&#8230;] This website lists some common techniques: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3365</div>
3366
3367</div>
3368</div>
3369
3370</li><li id="comment-323392" class="pingback odd alt thread-odd thread-alt depth-1">
3371
3372<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3373<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3374
3375
3376
3377<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://w3toppers.com/sql-how-to-store-and-navigate-hierarchies/" target="_self" >SQL &#8211; How to store and navigate hierarchies? &#8211; w3toppers.com</a></div>
3378
3379
3380<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-06-01T20:06:47-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323392">2022/06/01</a></time></div>
3381
3382</div>
3383
3384
3385<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3386</div>
3387
3388</div>
3389</div>
3390
3391</li><li id="comment-323404" class="pingback even thread-even depth-1">
3392
3393<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3394<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3395
3396
3397
3398<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://w3toppers.com/php-mysql-best-tree-structure/" target="_self" >php / Mysql best tree structure &#8211; w3toppers.com</a></div>
3399
3400
3401<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-06-16T12:40:55-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323404">2022/06/16</a></time></div>
3402
3403</div>
3404
3405
3406<div class="wp-block-comment-content"><p>[&#8230;] can use a Nested Set Model as it yields very efficient queries. Check out Managing Hierarchical Data in MySQL and read the section called Nested Set [&#8230;]</p>
3407</div>
3408
3409</div>
3410</div>
3411
3412</li><li id="comment-323414" class="pingback odd alt thread-odd thread-alt depth-1">
3413
3414<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3415<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3416
3417
3418
3419<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://getridbug.com/mysql/recursive-self-query/" target="_self" >recursive self query</a></div>
3420
3421
3422<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-06-27T22:34:45-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323414">2022/06/27</a></time></div>
3423
3424</div>
3425
3426
3427<div class="wp-block-comment-content"><p>[&#8230;] Mike Hillyer: Managing Hierarchical Data in MySQL [&#8230;]</p>
3428</div>
3429
3430</div>
3431</div>
3432
3433</li>
3433<li id="comment-323415" class="pingback even thread-even depth-1">
3434
3435<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3436<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3437
3438
3439
3440<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://getridbug.com/mysql/retrieving-data-with-a-hierarchical-structure-in-mysql/" target="_self" >Retrieving data with a hierarchical structure in MySQL</a></div>
3441
3442
3443<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-06-27T22:35:56-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323415">2022/06/27</a></time></div>
3444
3445</div>
3446
3447
3448<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3449</div>
3450
3451</div>
3452</div>
3453
3454</li><li id="comment-323427" class="pingback odd alt thread-odd thread-alt depth-1">
3455
3456<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3457<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3458
3459
3460
3461<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://getridbug.com/android/android-treeview/" target="_self" >Android Treeview</a></div>
3462
3463
3464<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-07-08T03:38:27-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323427">2022/07/08</a></time></div>
3465
3466</div>
3467
3468
3469<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3470</div>
3471
3472</div>
3473</div>
3474
3475</li><li id="comment-323433" class="pingback even thread-even depth-1">
3476
3477<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3478<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3479
3480
3481
3482<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://w3toppers.com/mysql-recursion/" target="_self" >Mysql recursion? &#8211; w3toppers.com</a></div>
3483
3484
3485<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-07-18T00:28:53-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323433">2022/07/18</a></time></div>
3486
3487</div>
3488
3489
3490<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL &#8211; not as clear as the above. [&#8230;]</p>
3491</div>
3492
3493</div>
3494</div>
3495
3496</li><li id="comment-323434" class="pingback odd alt thread-odd thread-alt depth-1">
3497
3498<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3499<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3500
3501
3502
3503<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://codesolution.info/eloquent-parent-child-relationship-on-same-model/" target="_self" >Eloquent Parent-Child relationship on same model &#8211; Code Solution</a></div>
3504
3505
3506<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-07-19T02:24:57-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323434">2022/07/19</a></time></div>
3507
3508</div>
3509
3510
3511<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3512</div>
3513
3514</div>
3515</div>
3516
3517</li>
3517<li id="comment-323444" class="pingback even thread-even depth-1">
3518
3519<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3520<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3521
3522
3523
3524<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://getridbug.com/database-administrators/parent-child-relationship-or-not-if-the-name-of-the-field-implies-the-relationship/" target="_self" >Parent/child relationship or not if the name of the field implies the relationship?</a></div>
3525
3526
3527<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-08-05T03:56:24-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323444">2022/08/05</a></time></div>
3528
3529</div>
3530
3531
3532<div class="wp-block-comment-content"><p>[&#8230;] representing trees in SQL. 4 are discussed by Bill Karwin here (and in his book which I recommend). This paper is also interesting (MySQL specific). See here (answer by Eldrith Conundrum) for a comparison [&#8230;]</p>
3533</div>
3534
3535</div>
3536</div>
3537
3538</li><li id="comment-323447" class="pingback odd alt thread-odd thread-alt depth-1">
3539
3540<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3541<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3542
3543
3544
3545<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/" target="_self" >What is the most efficient/elegant way to parse a flat table into a tree? &#8211; Code D3</a></div>
3546
3547
3548<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-08-06T16:21:03-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323447">2022/08/06</a></time></div>
3549
3550</div>
3551
3552
3553<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL [&#8230;]</p>
3554</div>
3555
3556</div>
3557</div>
3558
3559</li><li id="comment-323455" class="pingback even thread-even depth-1">
3560
3561<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3562<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3563
3564
3565
3566<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/how-to-repair-a-corrupted-mptt-tree-nested-set-in-the-database-using-sql/" target="_self" >How to repair a corrupted MPTT tree (nested set) in the database using SQL?</a></div>
3567
3568
3569<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-08-26T20:40:21-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323455">2022/08/26</a></time></div>
3570
3571</div>
3572
3573
3574<div class="wp-block-comment-content"><p>[&#8230;] to clarify, I need to recalculate the numeric lft/rght values of a nested set, not the ids of neighboring [&#8230;]</p>
3575</div>
3576
3577</div>
3578</div>
3579
3580</li><li id="comment-323457" class="pingback odd alt thread-odd thread-alt depth-1">
3581
3582<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3583<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3584
3585
3586
3587<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/mysql-recursion/" target="_self" >Mysql recursion?</a></div>
3588
3589
3590<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-08-30T06:49:22-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323457">2022/08/30</a></time></div>
3591
3592</div>
3593
3594
3595<div class="wp-block-comment-content"><p>[&#8230;] Managing Hierarchical Data in MySQL &#8211; not as clear as the above. [&#8230;]</p>
3596</div>
3597
3598</div>
3599</div>
3600
3601</li>
3601<li id="comment-323461" class="pingback even thread-even depth-1">
3602
3603<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3604<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3605
3606
3607
3608<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database-2/" target="_self" >What are the options for storing hierarchical data in a relational database?</a></div>
3609
3610
3611<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-08-31T10:22:30-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323461">2022/08/31</a></time></div>
3612
3613</div>
3614
3615
3616<div class="wp-block-comment-content"><p>[&#8230;] Representing hierarchies in MySQL: very good overview of Nested Set in particular [&#8230;]</p>
3617</div>
3618
3619</div>
3620</div>
3621
3622</li><li id="comment-323464" class="pingback odd alt thread-odd thread-alt depth-1">
3623
3624<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3625<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3626
3627
3628
3629<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://codigolandia.com/java/vista-de-arbol-de-android/" target="_self" >Vista de árbol de Android &#8211; java en Español</a></div>
3630
3631
3632<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-09-07T12:15:10-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323464">2022/09/07</a></time></div>
3633
3634</div>
3635
3636
3637<div class="wp-block-comment-content"><p>[&#8230;] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> [&#8230;]</p>
3638</div>
3639
3640</div>
3641</div>
3642
3643</li><li id="comment-323469" class="pingback even thread-even depth-1">
3644
3645<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3646<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3647
3648
3649
3650<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/generating-depth-based-tree-from-hierarchical-data-in-mysql-no-ctes/" target="_self" >Generating Depth based tree from Hierarchical Data in MySQL (no CTEs)</a></div>
3651
3652
3653<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-09-18T22:22:18-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323469">2022/09/18</a></time></div>
3654
3655</div>
3656
3657
3658<div class="wp-block-comment-content"><p>[&#8230;] (which you are using) and nested sets. There is a very good write-up about these alternatives in Managing Hierarchical Data in MySQL. You can only do what you want in a single query with the nested set model. However, the nested set [&#8230;]</p>
3659</div>
3660
3661</div>
3662</div>
3663
3664</li><li id="comment-323472" class="pingback odd alt thread-odd thread-alt depth-1">
3665
3666<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3667<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3668
3669
3670
3671<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://dbafix.com/sqlite-can-you-use-a-delete-trigger-to-delete-other-records-in-the-same-table/" target="_self" >SQLite: Can you use a DELETE trigger to delete other records in the same table?</a></div>
3672
3673
3674<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-09-24T20:25:15-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323472">2022/09/24</a></time></div>
3675
3676</div>
3677
3678
3679<div class="wp-block-comment-content"><p>[&#8230;] have a nested-set model in my database and I would like to ensure than when a parent node is somehow deleted from it, all [&#823
36790;]</p>
3680</div>
3681
3682</div>
3683</div>
3684
3685</li><li id="comment-323474" class="pingback even thread-even depth-1">
3686
3687<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3688<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3689
3690
3691
3692<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/what-are-the-known-ways-to-store-a-tree-structure-in-a-relational-db/" target="_self" >What are the known ways to store a tree structure in a relational DB?</a></div>
3693
3694
3695<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-09-28T10:03:44-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323474">2022/09/28</a></time></div>
3696
3697</div>
3698
3699
3700<div class="wp-block-comment-content"><p>[&#8230;] is the &#8220;put a FK to your parent&#8221; method, i.e. each records points to it&#8217;s [&#8230;]</p>
3701</div>
3702
3703</div>
3704</div>
3705
3706</li><li id="comment-323478" class="pingback odd alt thread-odd thread-alt depth-1">
3707
3708<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3709<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3710
3711
3712
3713<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://stackcodereview.com/a-child-id-getting-all-parent-ids-2/" target="_self" >A child ID getting all parent IDs</a></div>
3714
3715
3716<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-10-07T16:52:46-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323478">2022/10/07</a></time></div>
3717
3718</div>
3719
3720
3721<div class="wp-block-comment-content"><p>[&#8230;] you were willing to change the tree representation to use the Nested Set Model, then the query might look [&#8230;]</p>
3722</div>
3723
3724</div>
3725</div>
3726
3727</li><li id="comment-323482" class="pingback even thread-even depth-1">
3728
3729<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3730<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3731
3732
3733
3734<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://php.dizzycoding.com/mysql-recursive-tree-search/" target="_self" >MySQL recursive tree search</a></div>
3735
3736
3737<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-10-20T13:08:51-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323482">2022/10/20</a></time></div>
3738
3739</div>
3740
3741
3742<div class="wp-block-comment-content"><p>[&#8230;] should really consider using the Modified Preorder Tree Traversal which makes such queries much easier. Here&#8217;s your table expressed with MPTT. I have left the [&#8230;]</p>
3743</div>
3744
3745</div>
3746</div>
3747
3748</li><li id="comment-323483" class="pingback odd alt thread-odd thread-alt depth-1">
3749
3750<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3751<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3752
3753
3754
3755<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://sql.dizzycoding.com/how-to-only-display-a-treeview-expand-sign-if-children-exist/" target="_self" >How to only display a TreeView expand sign [+] if children exist</a></div>
3756
3757
3758<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-10-21T14:36:55-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323483">2022/10/21</a></time></div>
3759
3760</div>
3761
3762
3763<div class="wp-block-comment-content"><p>[&#8230;] to this problem is to implement pre-ordered tree traversal on your set of hierarchical data. See <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>
3763 for an example [&#8230;]</p>
3764</div>
3765
3766</div>
3767</div>
3768
3769</li><li id="comment-323484" class="pingback even thread-even depth-1">
3770
3771<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3772<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3773
3774
3775
3776<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://fallosweb.com/es-posible-crear-una-consulta-recursiva-en-access/" target="_self" >¿Es posible crear una consulta recursiva en Access? &#8211; Fallosweb.com</a></div>
3777
3778
3779<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-10-25T07:26:00-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323484">2022/10/25</a></time></div>
3780
3781</div>
3782
3783
3784<div class="wp-block-comment-content"><p>[&#8230;] puede usar el «Modelo de conjunto anidado» de Celko para recuperar todos los padres. Esto requerirá modificar la estructura de la tabla, de manera que [&#8230;]</p>
3785</div>
3786
3787</div>
3788</div>
3789
3790</li><li id="comment-323486" class="pingback odd alt thread-odd thread-alt depth-1">
3791
3792<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3793<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3794
3795
3796
3797<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/creating-taxonomy-table-in-mysql/" target="_self" >Creating Taxonomy Table in MySQL</a></div>
3798
3799
3800<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-10-25T17:23:27-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323486">2022/10/25</a></time></div>
3801
3802</div>
3803
3804
3805<div class="wp-block-comment-content"><p>[&#8230;] was considering using the example put forth by the article Managing Hierarchical Data in MySQL, however it is adding the above list as records inside the table&#8230;.and I&#8217;m not sure if [&#8230;]</p>
3806</div>
3807
3808</div>
3809</div>
3810
3811</li><li id="comment-323491" class="pingback even thread-even depth-1">
3812
3813<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3814<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3815
3816
3817
3818<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/executing-multiple-queries-in-codeigniter-that-cannot-be-executed-one-by-one/" target="_self" >Executing multiple queries in codeigniter that cannot be executed one by one</a></div>
3819
3820
3821<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-11-06T10:12:07-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323491">2022/11/06</a></time></div>
3822
3823</div>
3824
3825
3826<div class="wp-block-comment-content"><p>[&#8230;] I have an &#8220;event&#8221; table. For simplicity, you can imagine that it should be like a hierarchical category. It uses the nested set model (Thanks to Mark Hillyer for his post at <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>) [&#8230;]</p>
3827</div>
3828
3829</div>
3830</div>
3831
3832</li>
3832<li id="comment-323492" class="pingback odd alt thread-odd thread-alt depth-1">
3833
3834<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3835<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3836
3837
3838
3839<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://coded3.com/mysql-recursive-get-all-child-from-parent/" target="_self" >MySQL Recursive get all child from parent</a></div>
3840
3841
3842<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-11-08T17:19:23-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323492">2022/11/08</a></time></div>
3843
3844</div>
3845
3846
3847<div class="wp-block-comment-content"><p>[&#8230;] been looking everywhere, and reading this <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a>, but i didn&#8217;t find the result i was looking for..any help would be appreciated, [&#8230;]</p>
3848</div>
3849
3850</div>
3851</div>
3852
3853</li><li id="comment-323495" class="pingback even thread-even depth-1">
3854
3855<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3856<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3857
3858
3859
3860<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://sql.dizzycoding.com/how-to-find-all-ids-of-children-recursively/" target="_self" >How to find all IDs of children recursively?</a></div>
3861
3862
3863<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-11-15T09:18:31-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323495">2022/11/15</a></time></div>
3864
3865</div>
3866
3867
3868<div class="wp-block-comment-content"><p>[&#8230;] There are two basic methods for doing this: adjacency lists and nested lists. Take a look at Managing Hierarchical Data in MySQL. [&#8230;]</p>
3869</div>
3870
3871</div>
3872</div>
3873
3874</li><li id="comment-323501" class="pingback odd alt thread-odd thread-alt depth-1">
3875
3876<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4f4284ed wp-block-columns-is-layout-flex" style="margin-bottom:var(--wp--preset--spacing--40)">
3877<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:40px"><div class="wp-block-avatar"></div></div>
3878
3879
3880
3881<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-comment-author-name"><a rel="external nofollow ugc" href="https://stackcodereview.com/getting-the-last-post-of-all-threads-2/" target="_self" >Getting the last post of all threads</a></div>
3882
3883
3884<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex" style="margin-top:0px;margin-bottom:0px"><div class="wp-block-comment-date"><time datetime="2022-12-26T18:41:26-07:00"><a href="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/#comment-323501">2022/12/26</a></time></div>
3885
3886</div>
3887
3888
3889<div class="wp-block-comment-content"><p>[&#8230;] with in MySQL (or most any other relational database). You might want to check out this article: <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> on managing hierarchical data in MySQL. You might for example find better read performance from [&#8230;]</p>
3890</div>
3891
3892</div>
3893</div>
3894
3895</li></ol>
3896
3897
3898
3899</div>
3900</div>
3901</section>
3902</main>
3903
3904
3905<footer class="wp-block-template-part">
3906<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
3907<div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-72d1568c wp-block-group-is-layout-flex" style="padding-top:var(--wp--preset--spacing--40)"><p class="wp-block-site-title"><a href="https://mikehillyer.com" target="_self" rel="home">Mike Hillyer&#039;s Personal Webspace</a></p>
3908
3909
3910<p class="has-text-align-right wp-block-paragraph"> Copyright 2023 Mike Hillyer, All Rights Reserved</p>
3911
3912
3913
3914<p class="wp-block-paragraph"></p>
3915</div>
3916</div>
3917</footer>
3918</div>
3919<script type="speculationrules">
3920{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wordpress/wp-*.php","/wordpress/wp-admin/*","/media/*","/wordpress/wp-content/*","/wordpress/wp-content/plugins/*","/wordpress/wp-content/themes/twentytwentythree/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
3921</script>
vendor: 1 bytes, line 3921
3921
3922<script data-wp-router-options="{&quot;loadOnClientNavigation&quot;:true}" fetchpriority="low" id="@wordpress/block-library/navigation/view-js-module" src="https://mikehillyer.com/wordpress/wp-includes/js/dist/script-modules/block-library/navigation/view.min.js?ver=1bf28ded04f9f188bdcb" type="module"></script>
vendor: 1 bytes, line 3922
3922
3923<script id="wp-syntax-js-js" src="https://mikehillyer.com/wordpress/wp-content/plugins/wp-syntax/js/wp-syntax.js?ver=1.2"></script>
vendor: 1 bytes, line 3923
3923
3924<script id="wp-emoji-settings" type="application/json">
3925{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://mikehillyer.com/wordpress/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}}
3926</script>
vendor: 1 bytes, line 3926
3926
3927<script type="module">
3928/*! This file is auto-generated */
3929var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
3930//# sourceURL=https://mikehillyer.com/wordpress/wp-includes/js/wp-emoji-loader.min.js
3931</script>
3931
3932</body>
3933</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.