【问题标题】:Two foreign keys of the same table and multiple JOIN with WHERE clause同一张表的两个外键和多个JOIN with WHERE子句
【发布时间】:2018-06-04 16:01:08
【问题描述】:

我有 3 个表的 MySql 数据库:

语言
lang_id       语言

单词
word_id    lang_id       单词

翻译
trans_id      word_id1    word_id2

我想获得我选择的两种语言之间的所有翻译。以下命令 (语法错误) 基于:
Two foreign keys of the same table. How do I write this SELECT statement?
MySQL multiple Inner Join with Where clause

在命令中,我试图获得语言 12 之间的翻译。

SELECT w1.word, lang1.lang AS w2.word, lang2.lang AS FULL
    FROM translation AS trans
    (JOIN (word AS w1 JOIN language AS lang1 ON lang1.id_lang=w1.lang_id)
       ON trans.word_id1=w1.id_word WHERE (w1.lang_id=1 OR w1.lang_id=2))
    (JOIN (word AS w2 JOIN language AS lang2 ON lang2.id_lang=w2.lang_id)
       ON trans.word_id2=w2.id_word WHERE (w2.lang_id=1 OR w2.lang_id=2))

解决方案 感谢@ahmed-gdoma,我想出了这个命令:

SELECT w1.word AS w1, l1.lang AS L1,w2.word AS w2, l2.lang AS L2 FROM translation AS t 
JOIN word AS w1 on w1.id_word=t.word_id1 
JOIN word AS w2 on w2.id_word=t.word_id2
JOIN language AS L1 on w1.lang_id=L1.id_lang
JOIN language AS L2 on w2.lang_id=L2.id_lang
WHERE (l2.id_lang=1 OR l2.id_lang=2) 
AND (l1.id_lang=2 OR l1.id_lang=1)

它返回单词(w1),它的语言(L1),单词(w2)的翻译和翻译的语言(L2)

【问题讨论】:

  • 您给出了两个不清楚的描述,“两种特定语言之间的所有翻译”和“获取语言 1 和 2 之间的翻译”,而您给出的查询却没有这样做。我们怎么知道你想要什么?给出示例 DDL、输入参数和表格以及所需的输出,并使用英语以不依赖示例的方式解释您想要的内容。请阅读minimal reproducible example 并采取行动。 PSPKs, FKs & other constraints are not needed to query.
  • 嗨。 “不工作”是什么意思?该查询甚至不解析。阅读手册或任何介绍中的 SELECT 语句的语法。你最里面的括号是不必要的,你的其他人非法分组。子查询(即选择表名可以去哪里)需要括号和别名。但是您不需要 子查询,因为您可以进行一系列连接。从您可以单独工作的部分构建您的查询。

标签: mysql join foreign-keys


【解决方案1】:

问题在于 FULL 在 MySQL 中是 reserved keyword,因此,您需要为 AS 选择不同的名称。

在下文中,我将其替换为COMBINED

SELECT w1.word, lang1.lang AS w2.word, lang2.lang AS COMBINED
FROM translation AS trans
(JOIN (word AS w1 JOIN language AS lang1 ON lang1.id_lang=w1.lang_id)
   ON trans.word_id1=w1.id_word WHERE (w1.lang_id=1 OR w1.lang_id=2))
(JOIN (word AS w2 JOIN language AS lang2 ON lang2.id_lang=w2.lang_id)
   ON trans.word_id2=w2.id_word WHERE (w2.lang_id=1 OR w2.lang_id=2)

希望这会有所帮助! :)

【讨论】:

  • 我摆脱了 'AS'es 并按照您的建议将 'FULL' 替换为 'COMBINED' - 遗憾的是仍然无法正常工作。
  • @ObsidianAge AS 在标准 SQL 的 FROM 和 SELECT 中都是可选的。还有 MySQL,在此处标记。
【解决方案2】:
SELECT w1.word AS L1,w2.word as L2 FROM translation AS t 
JOIN word AS w1 on w1.word_id=t.word_id1 
JOIN word AS w2 on w2.word_id=t.word_id2

【讨论】:

  • 谢谢,即使这不是我想要的,它导致了正确的命令。你的命令只返回单词,我想要单词+语言。这是我想出的:'SELECT w1.word AS w1, l1.lang AS L1,w2.word AS W2, l2.lang AS L2 FROM translation AS t JOIN word AS w1 on w1.id_word=t.word_id1 JOIN word AS w2 on w2.id_word=t.word_id2 JOIN language AS L1 on w1.lang_id=L1.id_lang JOIN language AS L2 on w2.lang_id=L2.id_lang'
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2014-05-25
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多