【问题标题】:MySQL tree structureMySQL树形结构
【发布时间】:2021-04-04 12:59:21
【问题描述】:

您好,我正在尝试使用 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 中 eq 为“fra”,则返回具有该名称的行,否则返回“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  |

【问题讨论】:

  • 是什么阻止你尝试这个?
  • 我不知道如何写“if 语句”,如果两种语言都存在,则只返回一个“法语”,忽略“英语”,但如果只有“英语”可用,则返回它。
  • 喜欢在 HAVING lang = "fra" 中添加一些东西,但如果不存在则只返回一个 "eng"
  • 对子查询有什么想法吗?

标签: mysql sql left-join case greatest-n-per-group


【解决方案1】:

如果您运行的是 MySQL 8.0,我会推荐窗口函数:

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

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

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

【讨论】:

    【解决方案2】:

    这应该可以,试一试:

    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
    

    【讨论】:

    • tnx sir 看起来工作了 thx 百万次!
    • 如果您发现问题使用完整的 tnx,请您投票!
    【解决方案3】:

    如果您将 table2 拆分为 2 个表,一个只有英文条目,另一个只有法语条目,并在 id 上加入这些表,然后您将有一个表,其中每个 id 都有单行,其中包含说明哪种语言名称所需的信息使用。

    【讨论】:

    • 是的,谢谢,但我可以修改表结构
    • 使用 SQL 中的子查询进行拆分和连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多