› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
ebony0319
V2EX  ›  MySQL

一个 SQL 等级业务分析。

  •  
  •   ebony0319 · Aug 10, 2017 · 4867 views
    This topic created in 3332 days ago, the information mentioned may be changed or developed.

    有两个关键字:一是等级,我用 G 表示,父节点,我用 P 表示。

    现在需要做一个查询,选择该节点下所有一级子节点(比如 A 下面就是 B,E;)和在该节点下(这个很重要)所有一级子节等级相同的所有结果。

    比如在 A 结果下查找:结果应该是 B,C,D,E。

    在 B 下查找结果应该是 C 和 D 但是没有 E。

    比如 A 下第一级子节点:

    select * from table where P='A';

    查找与 A 一级子节点等级相同的结果,这里假如知道是 1 ;

    select * from table where G=1;

    这样两个结果集何在一起但是不能在该节点下,不知道怎么做减法。

    一些思路:1 递归,2 闭包表设计

    越写越复杂,不知道哪位有一些好的方法。

    4 replies  •  2017-08-11 13:46:36 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       Aug 10, 2017 via iPhone
    mysql 纯写 sql 不行
    pg 有 recurisive cte 应该可以
    weizhiyao008
        2
    weizhiyao008  
       Aug 10, 2017
    sql server 可以使用 with as,本质应该就是递归
    CRVV
        3
    CRVV  
       Aug 11, 2017
    PostgreSQL

    CREATE TABLE tree (
    id TEXT PRIMARY KEY,
    parent TEXT REFERENCES tree(id),
    grade int
    );

    INSERT INTO tree (id, parent, grade) VALUES
    ('A', NULL, 0),
    ('B', 'A', 1),
    ('C', 'B', 1),
    ('D', 'B', 1),
    ('E', 'A', 1),
    ('F', 'E', 2),
    ('G', 'B', 2);

    WITH RECURSIVE subquery AS (
    SELECT children.id, children.grade FROM tree AS parent
    INNER JOIN tree AS children ON children.parent = parent.id WHERE parent.id = 'A'
    UNION
    SELECT children.id, parent.grade FROM subquery AS parent
    INNER JOIN tree AS children ON parent.id = children.parent AND parent.grade = children.grade
    )
    SELECT * FROM subquery;
    resturlaub
        4
    resturlaub  
       Aug 11, 2017
    加个字段
    A /A
    B /A/B
    C /A/B/C
    D /A/B/D
    E /A/E
    F /A/F


    select * from <table> where <new_field> like '/A%';
    select * from <table> where <new_field> like '/A/B%';
    select * from <table> where <new_field> like '/A/E%';
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2544 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:16 · PVG 10:16 · LAX 19:16 · JFK 22:16
    ♥ Do have faith in what you're doing.