MySQL 树结构

MySQL tree structure

你好,我正在尝试用 MySql 准备树结构,表格看起来像这样。

 |id   |parent_id |               |entry_id| name  |lang  |
 |-----|----------|               |--------|-------|------|
 |   1 |    0     |               |       1| ABC   | eng  |
 |   2 |    1     |               |       1| BCD   | fra  |
 |   3 |    2     |               |       2| EFG   | eng  |
 |   4 |    2     |               |       2| HIJ   | fra  |
 |   5 |    2     |               |       3| WYX   | eng  |

我的问题是:

  1. 是否可以进行左连接并按名称对列进行排序,但如果在 lang 中等于“fra”return 具有该名称的行,否则 return“eng”名称。

伪代码

SELECT id, name FROM table LEFT JOIN table2 ON id = entity_id 
WHERE (IF lang = 'fra' return french name otherwise return just english name) GROUP BY entry_id ORDER BY name ASC

所以最后的结果是这样的,总的来说“fra”lang优先,所有的结果都应该按名字排序。

        |      id| name  |lang  |
        |--------|-------|------|
        |       1| BCD   | fra  |
        |       2| HIG   | fra  |
        |       3| WYX   | eng  |

如果您将 table2 分成 2 个 table,一个只有英文条目,另一个只有法语条目,然后加入 id,您将得到一个 table 每个 id 都有一行,其中包含告知要使用哪种语言的名称所需的信息。

这应该有效,试一试:

SELECT 
   id, 
   name,
   CASE WHEN tfra.entry_id is null THEN teng.name ELSE tfra.name END as name 
FROM table 
LEFT JOIN table2 tfra ON id = tfra.entity_id AND tfra.lang='fra'
LEFT JOIN table2 teng ON id = teng.entity_id AND teng.lang='eng'
WHERE (IF lang = 'fra' return french name otherwise return just english name) 
ORDER BY name ASC

如果你是运行 MySQL 8.0,我会推荐window函数:

select entity_id, name, lang
from (
    select t2.*,
        row_number() over(partition by entity_id order by field(lang, 'fra', 'eng')) rn
    from table2 t2
) t2
where rn = 1

如果您需要加入另一个 table(这在您的示例数据中并不明显),您可以这样做:

select t1.*, t2.name, t2.lang
from table1 t1
left join (
    select t2.*,
        row_number() over(partition by entity_id order by field(lang, 'fra', 'eng')) rn
    from table2 t2
) t2 on t2.entity_id = t1.id and t2.rn = 1