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 |
我的问题是:
- 是否可以进行左连接并按名称对列进行排序,但如果在 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
你好,我正在尝试用 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 |
我的问题是:
- 是否可以进行左连接并按名称对列进行排序,但如果在 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