gpt4 book ai didi

MySQL 连接和空值

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:50 24 4
gpt4 key购买 nike

我已经在互联网上浏览了几个小时,但似乎无法弄清楚这一点!

我有一些 table :

资源短缺

idResourceShortvalue idLanguage
1 播放 1
2 简单 1
... ... 257 jouer 2

资源原创

idResourceOriginalvalue 上下文
1 玩 按钮玩游戏
2 简单 ai 模式
... ... ...

ResourceOriginal_ResourceShort

idResourceOriginalidResourceShort
1 1
1 257
... ... 2



idLanguagename
1 英语
2 法语
3 意大利语
... ...

我希望检索每种语言的所有值,如下所示:

翻译

语言名称上下文 值
英语 按钮来玩游戏
法语 按钮玩游戏 Jouer
意大利语 按钮玩游戏NULL

我目前有这样的查询:

SELECT Language.name, ResourceOriginal.context, ResourceShort.value FROM ResourceShort JOIN ResourceOriginal_ResourceShort ON ResourceOriginal_ResourceShort.idResourceShort = ResourceShort.idResourceShort JOIN ResourceOriginal ON ResourceOriginal_ResourceShort.idResourceOriginal = ResourceOriginal.idResourceOriginal JOIN Language ON Language.idLanguage = ResourceShort.idLanguage WHERE ResourceOriginal.value LIKE 'Play



...它只产生英语和法语的结果 - 我也想包括空值。

注意:在 ResourceShort 中,意大利语的行不存在 - 翻译尚不存在。

本质上,我想列出数据库中某个单词的所有翻译。

如果不清楚:
  • ResourceOriginal 是原始字符串
  • ResourceShort 是原始字符串的翻译,包括原始语言。 (是的,数据是多余的,但可以减少复杂的查询)。

  • 非常感谢任何帮助,解决方案将得到我的投票!

    谢谢大家!

    最佳答案

    我想我理解你想要返回的东西;下面的查询应该让你明白。

    看起来您想从 ResourceOriginal 获取所有行与某些谓词匹配的表,在您的示例中,与 value'Play' .

    然后,对于 Language 中的每一行(如果你有英语、法语和意大利语),你想查找相应的值。我们在查询中使用的“技巧”是 CROSS JOIN。这为我们提供了每种语言的匹配行。所以,如果我们从 ResourceOriginal 返回一行,我们从 Language 获得三行,我们将返回三行。

    使用该集合,我们可以查找实际值。但是我们需要使这些查找成为 OUTER 连接,这样我们就不会消除任何行。我们希望保留为每种语言生成的行,即使我们没有找到匹配项。当没有找到匹配的行时,我们将返回一个 NULL。

    像这样的东西:

    SELECT l.name
    , o.context
    , s.value
    FROM Language l
    CROSS
    JOIN ResourceOriginal o
    LEFT
    JOIN ResourceOriginal_ResourceShort r
    ON r.idResourceOriginal = o.idResourceOriginal
    LEFT
    JOIN ResourceShort s
    ON s.idResourceShort = r.idResourceShort
    AND s.idLanguage = l.idLanguage
    WHERE o.value LIKE 'Play'

    注意:因为这样做是为了保留空值,并且因为 RO_RS 中有多个行。与 RO 中的一行相关的,我们得到多行。

    如果数据模型略有不同,则可以避免这种情况。如果 RO_RS 表包含 idLanguage 值(因此可以在 JOIN 子句中包含适当的谓词)。或者,如果 RO_RS 表被完全消除,则 RS 表可能具有指向 RO 表的直接外键。

    我们可以在值周围使用 GROUP BY 和 MAX 聚合......但这不能适本地处理模型允许的更一般的情况......也就是说,对于相同语言的 RS 中的两行或多行,与同一个 RO 相关。 (该 RO_RS 表允许多对多,)

    请注意,数据模型允许两个(或更多) RS对于任何给定的 RO 使用相同的语言.

    考虑是否还添加了这些行:
    RS
    258, 'bazinga', 3
    259, 'booyah' , 3

    RO_RS
    1, 258
    1, 259

    这导致将这些行添加到结果集中。
    language   context    value
    -------- ------- -------
    Italian button... bazinga
    Italian button... booyah

    关于MySQL 连接和空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171482/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com