如何对mysql表中的多个列进行连接

Posted

技术标签:

【中文标题】如何对mysql表中的多个列进行连接【英文标题】:How to do joins on multiple columns in mysql table 【发布时间】:2021-11-03 07:37:52 【问题描述】:

我有一个包含许多列的“响应”表,其中一些列采用与另一个“答案”表相对应的整数值。这是响应表:

表响应:

name      | answer1 | answer2 | answer3
----------------------------------
james foo | 1       | 2       | 3

表格答案_参考:

id | answer 
------------
1  | Yes
2  | No
3  | Maybe

所以我希望能够从 james foo 那里得到答案,结果应该是

name      | answer1 | answer2 | answer3
----------------------------------
james foo | Yes     | No      | Maybe

这是我尝试过的查询:

select t1.name, al.answer, al2.answer FROM response t1 LEFT JOIN answers_ref al ON t1.answer1 = al.id LEFT JOIN answers_ref al2 ON t1.answer2 = al2.id;

上述方法可以获得 2 个答案,但我必须进行第三次连接才能获得 answer3,但是如果我有 10 个答案/列怎么办?

【问题讨论】:

你需要 10 个连接,除非你改变表的设计。 如果答案列不固定,请使用数据透视表。 在我看来,它的数据库设计非常糟糕。如果还不算太晚,您现在应该更改它。 您可以通过检查我的查询来了解其中表使用单次和多行值转换为多列的情况。请查看***.com/questions/69268254/… 什么 mysql 版本? 【参考方案1】:

这个有效。我测试过:

SELECT r.name, 
  (SELECT answer FROM answers_ref WHERE id = r.answer1) as answer1, 
  (SELECT answer FROM answers_ref  WHERE id = r.answer2) as answer2, 
  (SELECT answer FROM answers_ref  WHERE id = r.answer3) as answer3
FROM response r
WHERE name = 'James Foo';

【讨论】:

阅读说明子查询可以在 SELECT 子句、FROM 子句和 WHERE 子句中使用的文档让我对其进行了测试。以前从未使用过它。感谢您提出的非常好的问题。 OP 在问 "但是如果我有 10 个答案/列怎么办?" ;这似乎意味着 OP 可能正在尝试找到一个解决方案,在该解决方案中,只要有新列,他们就不必担心在查询中添加/删除一行。 响应表的列数是固定的,他希望将 id 与值进行一对一的替换。这是一个直接查找表,是子查询的工作。当然,他可以以编程方式完成,从 answers_ref 表中查找所有内容(它只有 3 行)并将其缓存在代码中,然后用相应的值替换 anwer id。不需要 JOIN。 我不是在谈论是否使用加入。 OP 已经在他们的查询中实践了这一点,而您的建议(没有加入)是替代方案。我看到的是,每当添加/删除新列时,都需要维护这两个查询。否则查询会返回错误,对吧? 您好,感谢您的回答,是的,您的解决方案确实有效,在我看来,您的查询比我的多个连接更具可读性,但正如我上面所说,我有很多列,所以输入所有内容仍然很麻烦列名。【参考方案2】:

您无法通过更少的连接来实现这一目标。每一列都是单独处理的,它们不会神奇地以某种方式在它们之间共享“连接”值。

规则很简单 - 每列一个连接,就是这样。没有比这更简单或更短的了。

所以答案是:这是不可能的。

【讨论】:

您可以通过零连接来实现。见下文。 @RoslanAmir 这些子查询的性能更差。并且比连接的可读性差。 我认为 JOIN 在性能方面比子查询更差。 嗯,这与你或我的想法无关 :) 这是事实。

以上是关于如何对mysql表中的多个列进行连接的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中的表的多个列中查找连接的字符串

对同一个表中的多个列执行内连接

如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?

如何正确使用连接/子查询从多个表中选择数据? (PHP-MySQL)

sql中如何使一列中的多个重复数据只显示第一条

MySQL如何更新另一个表中同一行的多个列