使用用户输入连接三个表

Posted

技术标签:

【中文标题】使用用户输入连接三个表【英文标题】:Joining three tables w/user input 【发布时间】:2017-08-24 11:37:49 【问题描述】:

我有三个表,A、B、C。表 B 在 A 和 C 中都有外键。A 和 C 彼此之间没有键。

我正在尝试编写一个查询,在该查询中,我从表 C 中的主键(B 中的外键)与表 A 中的主键(也是 B 中的外键)匹配的列中获取每个命中。一个问题是我试图根据用户输入获取此信息,这将是表 A 中的一个单独列。

例子:

TABLE A
-------
aID    aName
1      Squeakers
2      Formations
3      Hutsis
4      Pms

TABLE B
-------
bID    aID    cID
1      1      27930
2      1      21405
3      1      24013
4      2      21111
5      1      34100
6      1      20841
7      4      30001

TABLE C
-------
cID      cName
21405    Silver Flyer
27930    Babs McGee
30001    Jimmy McGill
24013    Fletcher Mason
21111    Spike Fester
34100    Hope Sisco
20841    Ellis Traeger

所以我希望用户输入“Squeakers”,然后得到如下所示的内容:

Squeakers – Babs McGee, Silver Flyer, Fletcher Mason, Hope Sisco, Ellis Trager

我已经被困在这个问题上好几天了,无法弄清楚语法。我不确定我是否需要子查询,或者它是否不都是 INNER JOINS?

【问题讨论】:

Joining three tables using mysql的可能重复 【参考方案1】:

您可以使用 JOINGROUP_CONCAT() 来连接所有表并在一行中获取所有 cName。

试试这个:

SELECT GROUP_CONCAT(C.cName) AS cNames
FROM TableA A 
INNER JOIN TableB B ON A.aID = B.aID 
INNER JOIN TableC C ON B.cID = C.cID
WHERE A.aName = 'Squeakers';

【讨论】:

这是不正确的解决方案 - 预期结果是 1 行 @nimdil 用户可以使用 GROUP_CONCAT() 函数进入一行请检查更新的答案 我知道这实际上是我的解决方案【参考方案2】:
SELECT aName, GROUP_CONCAT(cName SEPARATOR ', ') as cNames
FROM A 
INNER JOIN B 
ON A.aID = B.aID
INNER JOIN C
ON B.cID = C.cID
GROUP BY aName, A.aID

您将获得两列 - 一列包含 aName,另一列包含聚合的 cName,以逗号分隔。我目前的 PC 上没有 MySQL,但它或多或少应该像这样工作。

【讨论】:

【参考方案3】:

A - 作者(每个作者一行) Author_Id、Author_Name、Author_Country

B - Author_Books(作者和书籍之间的关系表,每个关系一行) AB_ID、Author_ID、Book_ID

C - 书籍(每本书一行) Book_ID、Book_Name

现在,查询将是

Select a.Author_Name,b.Book_Name
from Author a, Author_Books B, Books C
where a.author_id =b.Author_ID
and B.Book_ID = C.Book_ID
and a.Author_Country = ? //This is your squeaker clause

【讨论】:

以上是关于使用用户输入连接三个表的主要内容,如果未能解决你的问题,请参考以下文章

SAP query创建

从Powershell中的文本文件中输入值

如何添加检查用户是不是在文本字段中输入了某些内容?

使用Navicat for Oracle新建表空间用户及权限赋予

远程连接mysql

Kettle6.0表输入连接数据库