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 — Mike Hillyer'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 […]" /> 14 <meta property="og:url" content="https://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" /> 15 <meta property="og:site_name" content="Mike Hillyer'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 — Mike Hillyer'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'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 — Mike Hillyer's Personal Webspace</title> 26<link rel='dns-prefetch' href='//www.googletagmanager.com' /> 27<link rel="alternate" type="application/rss+xml" title="Mike Hillyer's Personal Webspace » Feed" href="https://mikehillyer.com/feed/" /> 28<link rel="alternate" type="application/rss+xml" title="Mike Hillyer's Personal Webspace » Comments Feed" href="https://mikehillyer.com/comments/feed/" /> 29<link rel="alternate" type="application/rss+xml" title="Mike Hillyer's Personal Webspace » 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&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'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’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> </p> 333<p>[amazon-related-products keywords=”
333joe celko trees”]</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’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’s <strong>lft</strong> value will always appear between its parent’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=”mysql”]</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 <li></li> and <ul></ul> 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 <= 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 <= 1</strong> line to <strong>HAVING depth = 1</strong>.</p> 539<h4>Aggregate Functions in a Nested Set</h4> 540<p>Let’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’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’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 > @myRight; 604UPDATE nested_category SET lft = lft + 2 WHERE lft > @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’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 > @myLeft; 640UPDATE nested_category SET lft = lft + 2 WHERE lft > @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’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 > @myRight; 681UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @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 > @myRight; 717UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @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 > @myRight; 752UPDATE nested_category SET lft = lft - 2 WHERE lft > @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’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’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’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=”database”]</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’s Trees and Hierarchies in SQL for Smarties</a> – 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 “Managing Hierarchical Data in MySQL”</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/1695b318268005832b832f1ef5e6a18c1e81a8fc7d7a4cdce3c339e847c3b096?s=80&d=mm&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’s book that you referenced and have skimmed, then read it. Your article helps me to understand the Nested Set model. I’m an old dog who has been writing adjacency list hierarchies since the early nineties. I always thought there could be ‘better way’, 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/bc42b68109763e529e259efcd4b04ea692fdaecb995299a9a192598290de2ffe?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&d=mm&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’re dealing with a graph instead of a hierarchy. If you’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/99219b3a385a55b0e44205c5fc551a4eb3f8e1bc17bb4665819ee7fa04b285fc?s=80&d=mm&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 “GROUP BY node.name” 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/8588390ad52555ab3bcf93c2322f55ac0450436cff5877ecbb8996846d0949fd?s=80&d=mm&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 & mysql,but I have no idea about it.<br /> 904My mlm webapplication’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/a1302e452a2b04b3775767a506289c1a9bc41fe8428bee521cc76ebb005b23d4?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/287a0ed31ae6fb1689d3d478c958cc6111b0a47f508946ede72145140c74c1dc?s=80&d=mm&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 – It never fails, it’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/731769b22cd2e586e15c923aa3b85d4e07709fede9bc56b3faa414af6d0535fb?s=80&d=mm&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 “pen-paper”, 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/be8a2bd3928443cb98af2610670ffb910fd07b84b59d7f134644e48eef623711?s=80&d=mm&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 “Retrieving a Single Path” in a “Nested Set Model”.</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/6521fb5d766fdb5e3069060439a645f9d0dd52e64dc1c4f091e6d9cc1315a098?s=80&d=mm&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 “retrieve a full tree” query and have the number of “children” 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/d77b8426920e811d9221bf493955583e6a5f3ce94db6172900c50c856f7d27cf?s=80&d=mm&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’t know and i’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/18b8a1eb1072034a8aa9106da252efe81179387386faa0fc7955814cc12f3eb1?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/179983c86250d397710a7d7d5ecc331feaf66969d49a5dc2a64c219bccb76d69?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/5c24a51de77f7437bba3e1e0ee13f1e687666363f1498440a67cae76792ea79b?s=80&d=mm&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 ‘Televisions’ and ‘Portable Electronics’, 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9445f567f43ee7a963270651e40e533634586f959e4df3d5398d001b1cb49be8?s=80&d=mm&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 – 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 – it would be nice if you could clean this up so it’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>[…] 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 […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/a1946892bc24e0b5e037f9ccd2027da2b8ed0eae0590b4b8943e173648986aea?s=80&d=mm&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 & clear explanation.<br /> 1170I implemented some of your code examples against a database I’d generated of a hard disk directory structure and got some strange results.<br /> 1171In the examples you’ve given, you’re using ‘GROUP BY node.name’. However, if I understand things correctly, this will only work if ‘node.name’ is unique for all entries.<br /> 1172If, as I discovered, you have multiple entries with the same ‘node.name’ then doing ‘GROUP BY node.category_id’ 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>[…] Take a look at <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/&nbsp" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/&nbsp</a>; for detail information on hierarchical relation in SQL. Assuming you have read this link, the […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/0061f84c3d40e8245d5e369bbe63f5e1b611f61385c9ef47124739ab6dd4110b?s=80&d=mm&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 « Alin'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>[…] 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 ‘Trees and Hierarchies in SQL for […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/3a20b4219d3a68a6cf350f0b592833627e5a94699e756b324dc957d8772d46ec?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/4fcf5a6f8d96e461113f454580d83ca7003c2d49c3f9d8292b233b78e511b7f0?s=80&d=mm&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->SUbs YOU HAVE WRONG QUERY OR NOT PROPER QUERY, I CANT LIST<br /> 1278LIKE THIS :<br /> 1279Missing cats-subs<br /> 1280a-> (I need this id)<br /> 1281a->b (Also this id)</p> 1282<p>Your Cat-subs<br /> 1283a->b->c (NO directly THIS ID)<br /> 1284a->b->c->d<br /> 1285…<br /> 1286YOUR QUERY PROBLEM IS :<br /> 1287 CORRECT QUERY MUST BE<br /> 1288———————–<br /> 1289 ELECTRONICS | NULL |NULL | NULL |<br /> 1290 ELECTRONICS | TELEVISIONS |NULL | NULL |<br /> 1291 ELECTRONICS | TELEVISIONS |TUBE | NULL |</p> 1292<p>YOURQUERY<br /> 1293————————————<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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/6b039998610aa7ac3b35e0829a5db47a2f94e595d4217475114d9775fde9467a?s=80&d=mm&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’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/97c072c56da8b8bc74330f2f7a2eebb4ba30a1e94cc1bd173be9406cc2eb98e8?s=80&d=mm&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’s not ther anymore.</p> 1346<p>One question on Adjacency List Model:</p> 1347<p>Let’s say you have in table also <code>position</code> INT field, that let’s you sort nodes that are <strong>on the same level</strong>, in your example let’s say I want “LCD” to come before “TUBE”, or I want “PORTABLE ELECTRONICS” to come before “TELEVISION”.<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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9a9c4bac5c23c4e2376b10b80ef6aa82311a73ffec7734988e5d3cbcc4ee7e92?s=80&d=mm&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’m not the best coder and I’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 > 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/e70cd404f280c2c0cae1e29c8e76f1db551ce04fd901156e54fa2551c4611fe2?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/132a84e7261b760ecfcc8e0253bc9a876e44cca79b6a7aa3069aaba30e0cf5d7?s=80&d=mm&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 “old-way” 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/7244d0f2833269114de402ece79c5f061f280e96ca132404dc32ad5275284739?s=80&d=mm&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’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c6bac0d31bb36a6f7f8d8914b3baace078039088e8f770bdde4fe0acff164d0c?s=80&d=mm&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 -> Pop -> Michael Jackson -> Thriller -> Thriller – Song<br /> 1503Suppose i want to search the category with like query ‘%s%’.</p> 1504<p>Now s is in 3 level (Level1 = Music),(Level3 = Michael Jackson ),(Level5 = Thriller – 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/7f10495a69c757e5f1d76e005c5891c73e3a35f87fb2e25609661693ec2a0183?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/09da8c03649217e8047bbca53d75fedeb83cbd469114cab8daf4aaadfcad4cc7?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/451d4c79960a9b86df7ee29444d4f6fc4f44feec7f25fad7217bdd1ced9d67c3?s=80&d=mm&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‘ORDER BY parent.lft’ as opposed to ‘node.lft’.</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’ve queried for a node.lft=’FLASH’).</p> 1574<p>If we had a “SELECT parent.name, node.name …” it would like like the following:</p> 1575<p>name | name<br /> 1576————————————————<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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/fcc2cf066365c4e474dcdd227900c59b35b6c2aef1687d2b0e960ce1875bd4dc?s=80&d=mm&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’000 acticle this takes long and all your references change too.<br /> 1624I wonder how ebay is doing this? You can’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&d=mm&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&camp=1789&creative=390957&creativeASIN=0123877334&linkCode=as2&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/43e7928bd8ea22214906df82c4abd2ecb9395b4c890f3e45dc186ea1459c444f?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/aeffca704969dc0a244f6ea930668509af55a7e3218c7ed0cda5de481a5db1e1?s=80&d=mm&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 – it’s really straight & 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… 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/040f48299fc7ae47a4d3d47669f2ab9a79fd2d81600fafbd561e1b7f7c326a25?s=80&d=mm&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’ve built an Enterprise marketplace product and converted from Adj. to Nested. It’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 < 1,000 products and/or < 10,000 categories.</p> 1719<p>What'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 …<br /> 1724FROM category AS node<br /> 1725JOIN category AS parent ON (MBRWithin(Point(0, node.lft), parent.sets))<br /> 1726…..</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 < 0.1 second. It's blazing fast. We've also added necessary single and combined indexes which also help I'm sure.</p> 1728<p>You'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 …<br /> 1734FROM category AS parent<br /> 1735JOIN category AS midpoint<br /> 1736JOIN category AS node<br /> 1737….<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 – 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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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>[…] You can also take a look here […]</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>[…] You should consider using Nested Sets to store your tree structure. Additionally you can improve the whole thing by using recursive […]</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>[…
1845] I am using Nested Tree Model […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/3633ccbc8d2535710a93edad0e90307711585024e9733d5722f8203dc8b333c8?s=80&d=mm&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’ve just switched from Adjacency List Model to nested set model.</p> 1867<p>I’think i’m starting to understand what is going on, but i have big problem – 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’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c97b134c1ae5a96c7db370cdf343265f00015347257856623562b2a9b718c95d?s=80&d=mm&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>[…] am using the following article from Mike Hillyer as a basis for creating a nested set model for use with comments and comment [̷
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 – 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>[…] 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, […]</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>[…] 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 […]</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? – 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>[…] Representing hierarchies in MySQL: very good overview of Nested Set in particular […]</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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/6106be7a2e3891c8816735cefecec5ea4dc6f9ab4a8e0755ec8ae91b689d9b4d?s=80&d=mm&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’ve implemented nsm in my project, thanks to this article.<br /> 2017Now I’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/84afebd9394441a8c7f8ae84d8866e240a7078629b6572a2da9a6cb89e0c8557?s=80&d=mm&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“t1.name = ‘ELECTRONICS’ AND”<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 – 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>[…] Manipulations-Methoden interessiert sind, empfiehlt Marc Alff Mike Hillyers Artikel “Managing Hierarchical Data in MySQL“. Die aktuellle Dokumentation des Performance-Schemas findet sich auf […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/20d589bd4d060dce12376466b6376049c7a5472ff2738b1b7b80c626c5857e16?s=80&d=mm&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’t worked. I changed ‘ORDER BY node.lft’ to ‘ORDER BY parent.lft’ 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>[…] using the “nested set model” (the backend used by our web application is CakePHP and the Project model uses the […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/252924c519030231e31c733d121f1e7b5fa8c52e1ce39555e2b31d6b22356534?s=80&d=mm&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) – 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/ef2fa71a4d46c672e1bc563ef5215f3a5e9c97b03bca331b50c8c0353b468921?s=80&d=mm&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 – 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>[…] 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 […]</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? – 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>[…] there two ways work hierarchy info in mysql: […]</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 – 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>[…] on <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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>[…] studied Adjacency List, Nested List & Closure table design, but came to conclusion that Session based Adjacency List can be better […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/86d377b0da46ff539ece75369b506cfe6a28773e58c6e9d3e894451d734460d0?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=80&d=mm&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>[…] Representing hierarchies in MySQL: very good overview of Nested Set in particular […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/8cbb43823483caff0aec8b93b1b5ff27a99119dd342f7584cc2f6bb6b21db87c?s=80&d=mm&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 -> 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] – 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>[…] 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> […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/73eeee964c37184f45fad2cfbf7043141e165674a985169541609dc79d791ca7?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/c3c4939551510d33d94c32aaf65c36ec4a931cf69c9a532294670c58ed07a35f?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/d11a99dd7f081d71d56bc6a7f13a9231ed7354b9bc682bd900542920cfa8fbb4?s=80&d=mm&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——————————-<br /> 2424LOCK TABLE nested_category WRITE;</p> 2425<p>SELECT @myRight := rgt FROM nested_category<br /> 2426WHERE name = ‘TELEVISIONS’;</p> 2427<p>UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;<br /> 2428UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;</p> 2429<p>INSERT INTO nested_category(name, lft, rgt) VALUES(‘GAME CONSOLES’, @myRight + 1, @myRight + 2);</p> 2430<p>UNLOCK TABLES;<br /> 2431————————-<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 – 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/f634df3c638cc159a32cb91b7bc30b69b774b83fff766046e33a581700ed7c08?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/b3b5e6a24227f065ce0404aea46994794792b6fbcab17cd476c29f20a0f76b7c?s=80&d=mm&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’s also a php lib called Boabab (which I haven’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/3f3f3af7f4a8c6db37caf382bef15447c7f2c9a506a32d7a9d326a568b0f9707?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=80&d=mm&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’s a question i’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’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/81f8637e80d25994f3ac463d454cd1eb38a1049d0fb3494c84bc3bf75766b15c?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/8d2e43a8174bf7108548f73bc6fc356836bfbc837e993ac8bad23a397ebac6a8?s=80&d=mm&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’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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&d=mm&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 — 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>[…] werden. Stattdessen lässt sich zum Beispiel das „Nested Set Model“ verwenden. Dieser Beitrag beschreibt sehr schön das „Nested Set Modell“ (englisch). Bei fokus² haben wir noch die rekursive Variante implementiert, da ich aufgrund der Erfahrung [̷
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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/e8b551af79a8804b1bfd46412a332d3f02edaf9daae5239efb73d73fc38d572a?s=80&d=mm&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 … – 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>[…] Great article … […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/4f3ccbaa4013e45f0d5be33c07e9eee5646998baafa91d832b38faa60724b1ed?s=80&d=mm&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>[…] is a detailed explanation. Unfortunately the article on mysql.com is does not exist any […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/1c99d3b34b8bc6daf79be6b258eca314596849c405436232db65c6c62ff959fb?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/860c989426cce55c22551d508290700a9dd191b972a329366805fb925746a5b5?s=80&d=mm&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>[…] Representing hierarchies in MySQL: very good overview of Nested Set in particular […]</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’s Personal Webspace – 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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=80&d=mm&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 “Hierarchy”, 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 “Hierarchy” 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9c85f51a3f8bf4c7cf1d7f84fe94bfaa8a76bb0a3b383e92da17a13c2bdd5afe?s=80&d=mm&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 “hierarchy”.<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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9a62120e40b6beb795a80f992380ed55714d70f9a28a3ea553fad79fd22cdb2b?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/69f87cb9e45237c13bdc332cd73b2b9a701e9956617bf576b2e1d79095a3f474?s=80&d=mm&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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/299b16c0cd7cfb73b6bbd3fb601b3003b95f56c339497384a8338aca14234d70?s=80&d=mm&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 & 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) – 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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/cfa40606dfef33b9a0aba2da07d6910104f19da4f1892e76d05f7ee0121245b9?s=80&d=mm&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’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 – 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>[…] are probably definitely several articles out there which cover the SQL implementation of the Nested Set Model, aka “modified […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/9907d87b42515e4df78923a6bf48278750798e43adf2bf087224bf2775023486?s=80&d=mm&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 = ‘TELEVISIONS’;<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) – 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) – @SUB_TREE_DEPTH – 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 – 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>[…] 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 […]</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" >ååæ´æ¢éç¥ – è¹è¹ä¹è²</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>[…] åæå°å ï¼åæä¸ Hierarchical Data ç´è¯ä¸º åå±ç»æ ï¼è¿éæç¿»è¯æ æ ç¶ç»æ ã […]</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’s: theory and use in Symfony – 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>[…] 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 […]</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åå±é彿¥è¯¢ – 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>[…] From the blog Managing Hierarchical Data in MySQL […]</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" >æä½³æ ç»æ – 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>[…] 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 […]</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 – å夫 çç« – – å¼å䏿</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>[…] is a detailed explanation. Unfortunately the article on mysql.com is does not exist any […]</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" >ÐеÑевÑÑ Ð² ÐÐ — ÐÐÐ ÐÐÐ ÐТÐÐÐЫРÐÐÐРСÐТÐÐ</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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/8d4c0d94acba8c22566f9b407947399a66f5cc097796f26c4aac49de5a742e29?s=80&d=mm&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 “lft” & “rgt”.<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 – ç¨åºæ é</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>[…] Representing hierarchies in MySQL: very good overview of Nested Set in particular […]</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? – 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>[…] Managing Hierarchical Data in MySQL […]</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? – 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>[…] One is the classic but rather mindbending nested sets. […]</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 – 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>[…] 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 […]</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 – 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>[…] 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> […]</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 – 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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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>[…] Managing Hierarchical Data in MySQL […]</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 – 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>[…] I am using a nested-set tree structure in a table. The concept is described here. […]</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 – 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>[…] this article: Managing Hierarchical Data in MySQL. It will give you a good starting point on how to implement the various […]</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 – Designing a threaded commenting system – 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>[…] 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> […]</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 – How to store and navigate hierarchies? – 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>[…] Managing Hierarchical Data in MySQL […]</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 – 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>[…] 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 […]</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>[…] Mike Hillyer: Managing Hierarchical Data in MySQL […]</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>[…] Managing Hierarchical Data in MySQL […]</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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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? – 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>[…] Managing Hierarchical Data in MySQL – not as clear as the above. […]</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 – 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>[…] Managing Hierarchical Data in MySQL […]</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>[…] 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 […]</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? – 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>[…] Managing Hierarchical Data in MySQL […]</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>[…] to clarify, I need to recalculate the numeric lft/rght values of a nested set, not the ids of neighboring […]</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>[…] Managing Hierarchical Data in MySQL – not as clear as the above. […]</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>[…] Representing hierarchies in MySQL: very good overview of Nested Set in particular […]</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 – 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>[…] <a href="http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/" rel="ugc">http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/</a> […]</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>[…] (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 […]</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>[…] 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 [̷
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>[…] is the “put a FK to your parent” method, i.e. each records points to it’s […]</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>[…] you were willing to change the tree representation to use the Nested Set Model, then the query might look […]</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>[…] should really consider using the Modified Preorder Tree Traversal which makes such queries much easier. Here’s your table expressed with MPTT. I have left the […]</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>[…] 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 […]</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? – 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>[…] 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 […]</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>[…] 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….and I’m not sure if […]</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>[…] I have an “event” 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>) […]</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>[…] 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’t find the result i was looking for..any help would be appreciated, […]</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>[…] There are two basic methods for doing this: adjacency lists and nested lists. Take a look at Managing Hierarchical Data in MySQL. […]</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>[…] 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 […]</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'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="{"loadOnClientNavigation":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.