SQL算法排序器

时间:2019-07-04 05:31:43

标签: sql mariadb mariadb-10.1

这是我的表格数据。如果cat_parent_id为0,则表示其父级,例如People and Culture是cat_id = 1的父级,Employee Benefits and Certification是People and Culture的子级。但是,员工福利和认证也有孩子。雇员福利cat_id = 6,因此他的孩子是SSS贷款查询,而证书的cat_id = 10,则他的孩子将是就业证明和SSS贡献证书。

enter image description here

预期输出:

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie-edge">
  <link rel="stylesheet" href="css/styles.css">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  <link rel="stylesheet" href="css/font-awesome.min.css">
  <title>Puerto Rico & Florida Recovery Training Academy</title>
</head>

<body>
  <header>
    <nav>
      <input type="checkbox" id="nav" class="hidden">
      <label for="nav" class="nav-btn">
            <i></i>
            <i></i>
            <i></i>
          </label>
      <div class="logo">
        <a href="#">PRFTA</a>
      </div>
      <div class="nav-wrapper">
        <ul>
          <li><a href="#">Home</a></li>
          <li><a href="#">Nosotros</a></li>
          <li><a href="#">Contacto</a></li>
          <li><a href="#" class="cursos">Cursos</a></li>
        </ul>
      </div>
    </nav>
    </div>
    </nav>
    <div class="wrapper">
      <div class="container">
        <h1>Puerto Rico & Florida Recovery Training Academy</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vitae doloremque autem nam, illo nisi soluta voluptatibus et in fugiat aliquid nostrum asperiores. Laboriosam vitae, minus odio! Iure id quaerat voluptatum.</p>
        <a href="#section-a" class="button">MAS INFORMACIÓN</a>
      </div>
    </div>
  </header>
  <section id="section-a">
    <div class="wrapper">
      <ul>
        <li><img src="prueba.png" alt=""></li>
        <li><img src="prueba.png" alt=""></li>
        <li><img src="prueba.png" alt=""></li>
        <li><img src="prueba.png" alt=""></li>
      </ul>
      <div class="content">
        <h1>¿PORQUÉ ESCOJER PRFTA?</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur error deserunt saepe explicabo obcaecati cupiditate dolor quam, nisi illo! Soluta.</p>
      </div>
      <div class="features">
        <div class="feature">
          <i class="fa fa-gear icon"></i>
          <div class="feature-contnt">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
        <div class="feature">
          <i class="fa fa-gear icon"></i>
          <div class="feature-contnt">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
      </div>
      <!-- Features Two. -->
      <div class="features">
        <div class="feature">
          <i class="fa fa-gear icon"></i>
          <div class="feature-contnt">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
        <div class="feature">
          <i class="fa fa-gear icon"></i>
          <div class="feature-contnt">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
      </div>
    </div>
  </section>
  <!-- Slider. -->

  <!-- Preguntas -->
  <section id="section-b">
    <div class="preguntas">
      <div class="wrapper">
        <h1>Preguntas frecuentes</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit laboriosam repellat labore, ad qui assumenda. Beatae perferendis at, provident aspernatur.</p>
      </div>
    </div>
    <!-- Preguntas 2 en flex -->
    <div class="wrapper">
      <div class="features-a">
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
      </div>

      <!-- Preguntas 2-4 en flex -->
      <div class="features-a">
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
      </div>

      <!-- Preguntas 4-6 en flex -->
      <div class="features-a">
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
        <div class="feature-a">
          <div class="feature-contnt2">
            <h2>¿PORQUÉ ESCOJER PRFTA?</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati, odit, earum! Veniam, repudiandae, ullam. Officia ut officiis voluptatem doloremque praesentium?</p>
          </div>
        </div>
      </div>


    </div>

    <!-- Curso -->
    <div class="clase">
      <div class="wrapper">
        <h1>¿Listos para comenzar?</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium possimus officia, consequuntur repellat natus voluptatibus ad explicabo architecto! Quos, saepe!</p>
        <div class="botones">
          <a href="#section-a" class="btn">PRESENCIAL</a>
          <a href="#section-a" class="btn2">EN LINEA</a>
        </div>
      </div>
    </div>
    </div>
  </section>

</body>

</html>

此刻我有点运气。

Admin and Facilities
  • Safety and Security Related Concerns
     • CCTV Footage

Information Technology
  • User Account
     • Enable / Disable Access

People and Culture
     • Certification
        • Certificate of Employment
        • SSS Certificate of Employment
     • Employee Benefits Request
        • SSS Loan Inquiry

主要目标是按字母顺序对每个父级(第一优先级),类别(第二优先级),子类别(第三优先级)进行数据排序。我正在使用别名排序器,但无法正常工作。

1 个答案:

答案 0 :(得分:1)

在MySQL 8之前的版本中,递归查询非常棘手。在您的情况下,您似乎只有3个级别(0、1和2),因此最好多次自我外联表,以获取从根到每个节点的路径。

最后,对从根到子的“路径”中的名称进行串联排序:

select a.cat_id, a.cat_level, a.cat_name, 
    concat(
        ifnull(concat(c.cat_name, '  '), ''),
        ifnull(concat(b.cat_name, '  '), ''),
        a.cat_name) as cat_order
from ticket_categories a
left join ticket_categories b on b.cat_id = a.cat_parent_id 
left join ticket_categories c on c.cat_id = b.cat_parent_id 
order by cat_order;

您可以轻松扩展此查询以支持更多级别;只需添加许多left join行和表别名,并相应地扩展concat表达式即可。

在MySQL 8中,您可以使用可以处理任意多个级别的递归查询:

with recursive cte(cat_id, cat_level, cat_name, cat_order) as (
  select cat_id, cat_level, cat_name, cat_name
  from ticket_categories
  where cat_parent_id = 0
  union
  select t.cat_id, t.cat_level, t.cat_name, concat(cte.cat_order, '  ', t.cat_name)  
  from cte
  inner join ticket_categories t on t.cat_parent_id = cte.cat_id
)
select * from cte
order by cat_order;

两个查询的输出:

cat_id | cat_level | cat_name                             | cat_order
-------+-----------+--------------------------------------+-------------------------------------------------------------------------------
   3   |     0     | Admin and Facilities                 | Admin and Facilities
   4   |     1     | Safety and Security Related Concerns | Admin and Facilities  Safety and Security Related Concerns
   9   |     2     | CCTV Footage Request                 | Admin and Facilities  Safety and Security Related Concerns  CCTV Footage Request
   2   |     0     | Information Technology               | Information Technology
   5   |     1     | User Account                         | Information Technology  User Account
   8   |     2     | Enable / Disable Access              | Information Technology  User Account  Enable / Disable Access
   1   |     0     | People and Culture                   | People and Culture
  10   |     1     | Certification                        | People and Culture  Certification
  11   |     2     | Certificate of Employment            | People and Culture  Certification  Certificate of Employment
  12   |     2     | SSS Certificate of Contributions     | People and Culture  Certification  SSS Certificate of Contributions

在路径(cat_order)中使用双精度空格作为分隔符。假设您的名字中不会包含双倍空格。如果可能的话,如果您使用的名称中,一个是另一个的前缀,则顺序可能会出错。

对于最终的缩进格式,您将使用cat_level列。但是我认为这种任务不属于SQL,尽管使用它很容易

concat(repeat('  ', cat_level), cat_name)

两个查询都为db fiddle