根据其中一个表中的值从多个表中获取 SQL 结果

Posted

技术标签:

【中文标题】根据其中一个表中的值从多个表中获取 SQL 结果【英文标题】:Get SQL results from multiple table based on value in one of the tables 【发布时间】:2021-10-22 13:58:54 【问题描述】:

我有一个主表(建议)和两个参考表(专家、朋友)

advices
----------------------------------------
|id      | advisor_id   | advisor_type |
----------------------------------------
| 1      | 6            | expert       |
| 2      | 6            | friend       |
| 3      | 7            | expert       |
| 4      | 8            | expert       |
----------------------------------------


expert
----------------------------------
|id      | lastname | firstname  |
----------------------------------
| 6      | Polo     |  Marco     |
| 7      | Wayne    |  John      |
| 8      | Smith    |  Brad      |
----------------------------------

friend
----------------------------------
|id      | lastname | firstname  |
----------------------------------
| 6      | Doe      |  John      |
| 7      | Brown    |  Jerry     |
| 8      | Goofy    |  Doofy     |
----------------------------------

我想获得所有建议(一些来自专家,一些来自朋友),并将他们各自的姓氏和名字作为结果集的一部分。

每个建议行都有参考表(专家表、朋友表),通过 id 和类型与之关联。

所以我希望得到一个基于 id 的结果,但取决于要查询哪个表的类型

结果如下所示 根据是专家还是朋友,结合参考表中的姓氏和名字。

advices (array)
----------------------------------------------------------------
|id      | advisor_id   | advisor_type   | lastname | firstname |
-----------------------------------------------------------------
| 1      | 6            | expert         | Polo     | Marco     |
| 2      | 6            | friend         | Doe      | John      |
| 3      | 7            | expert         | Wayne    | John      |
| 4      | 8            | expert         | Smith    | Brown     |
-----------------------------------------------------------------

在非编程简单的单词术语中,我想创建一个这样的查询。

   SELECT 
   advices.id, advices.advisor_id, advices.type
 
   IF advices.type==expert THEN expert.lastname, expert.firstname
   ELSE IF advices.type==friend THEN friend.lastname, friend.firstname

   FROM advices, expert, friend

显然,我知道 SELECT 语句不允许这种类型的动态逻辑。但这可以通过其他方式完成吗?

【问题讨论】:

【参考方案1】:

这应该可行:

SELECT a.*, e.firstname, e.lastname 
FROM advices AS a 
INNER JOIN expert AS e ON a.advisor_id = e.id AND a.advisor_type = 'expert'
UNION
SELECT a.*, f.firstname, f.lastname
FROM advices AS a 
INNER JOIN friend AS f ON a.advisor_id = f.id AND a.advisor_type = 'friend'

【讨论】:

谢谢。我有一个小的后续问题。现在所有的建议都传给了一位用户。如果将来,我想让 advices 表有一个 user_id 字段,这意味着我没有想要显示所有建议,但只有一个特定于 WHERE user_id='1'。我会把它放在哪里? SELECT * FROM () d WHERE d.user_id = 1 这似乎不起作用,但我改为在 ON 子句中添加:INNER JOIN Expert AS e ON a。 userid='1' AND a.advisor_id = e.id AND a.advisor_type = 'expert' 及以后 INNER JOIN friend AS f ON a.userid='1' AND a.advisor_id = f .id AND a.advisor_type = '朋友'

以上是关于根据其中一个表中的值从多个表中获取 SQL 结果的主要内容,如果未能解决你的问题,请参考以下文章

如何更新主表当前行的输入类型文本中的值从模态窗口表中获取值

MS-Access SQL 将同一表中的值从“Value”更新为“*Value”

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

根据表中其他列的值从同一表中的 2 列中选择信息

根据另一个表中的值从日期列中减去分钟

SQL JOIN