如何使用连接从 mysql 中的单个 table 获取唯一数据?
How to use joins to fetch unique data from a single table in mysql?
我在数据库中有 4 个表,它们是:-
- 分支机构
- 存款
- 借
- 客户
查询:查找居住在那格浦尔市的客户的贷款号,贷款城市,存款账号,存款城市?
我在下面写了一个成功获取三个数据的查询。
- 贷款号
- 贷城
- 存款账号
但是在获取存款城市时,我得到了与贷款城市相同的数据。
下面我分享我的代码,以便您可以找到我错的地方
我试过的代码:
SELECT borrow.loanno,
branch.city AS 'Borrow city',
deposit.actno,
branch.city AS 'Deposit city',
customer.city As 'Customer_city'
FROM customer
JOIN borrow
ON borrow.cname = customer.cname
JOIN branch
ON borrow.bname = branch.bname
JOIN deposit
ON deposit.cname = customer.cname
AND customer.city = 'Nagpur';
通过运行上面的代码,我得到的输出是
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Mumbai 104 Nagpur
375 Mumbai Mumbai 105 Nagpur
我想要的输出是:-
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Delhi 104 Nagpur
375 Mumbai Banglore 105 Nagpur
为了更好地理解,我正在分享我的 dB fiddle link 以便您清楚地了解。
请不要误会,但您所拥有的似乎不是一个好的数据库设计。通常,每个 table 都会有一个自动递增的基于整数的 ID 密钥,该密钥是唯一的并传递给每个基础 table。您的主键有字符串值。
我知道这看起来像是数据库设计的开始,但您确实需要一些帮助才能继续前进。
那么假设,您有 5 个名为“Anil”的人,那么您会怎么做...您完成了。 “Anil”是主键,您无法更改它。通过自动递增,您可以拥有 1000 个 Anil 客户,每个客户都有额外的信息以确保唯一性...名字、姓氏、地址和其他唯一信息。
现在开始查找分支 table。同样适用。你在孟买市有多个分支机构。会有重复的名字吗?可能的???因此,拥有一个 ID 列自动递增将解决问题,并且像客户这样的附加信息将确保像地址这样的唯一性。如“Kranti”分支。 “如果”你在 X 街有一个 Kranti 分支,而在 Y 街有一个 Kranti 分支,你可以安全地使用唯一的自动递增数字。
现在开始存款和借贷 tables。我知道它的样本数据,但只是为了展示 oops 是如何发生的。您的分行信息名称为“Chandani”,但您的存款 table 名称为“Chandni”(缺少第二个“a”)。我知道 o 型。
当您有数据输入屏幕并找到客户或分支机构时,系统将具有给定的记录“id”以存储在给定的存款或借贷中 table。不要根据 Anil 的客户示例中的字符串进行操作——如果您有 100 个 Anil 客户,请选择哪个示例。 ID 将确保正确的客户。与分支类似。应改为使用客户和分支机构的 ID 列(基于修改后的 database/table 结构)。
终于到你的查询了。您正在尝试将借款 table 与给定人员的存款结合起来。这只会让你头疼。没有存款保证借款(反之亦然)。现在,如果你有 5 次借款和 7 次存款给 Anil,你尝试查询这两种方式,你将得到 35 条记录被返回(笛卡尔积),因为对于借款中的每条记录 table匹配的客户将应用于这些存款。
所以,足够你考虑了,坐下来,深呼吸,消化一下。我可以向您展示一个更好的 table 结构来处理这里介绍的一些上下文。
至于写查询,你真的需要用简单的英语表达你想要得到什么,然后展示你是如何尝试的。此外,似乎没有匹配项,例如将存款应用于给定的借款,那么这有什么意义/逻辑。
再一次,真诚地面对你所面临的问题并愿意提供帮助,但你可能比你意识到的要远。
反馈
好吧,这是一个作业——一个糟糕的作业,但是 none-the-less。所以问题是你只使用了一个基于借款人的分支实例。你需要的是分行table加入TWICE...一次给借款人,一次给定金。在每一个中,我都给它“起了别名”。加入借用 table 时,我将其别名为“Bbranch”,表示“借用分支”。对于存款,我将“存款分行”别名为“DBranch”。于是每一个分别加入,这样每一个都会指向自己,分别拉城。
select
borrow.loanno,
BBranch.city as 'Borrow city',
deposit.actno,
DBranch.city as 'Deposit city',
customer.city
from
customer
join borrow
on customer.cname = borrow.cname
join Branch BBranch
on borrow.bname = BBranch.bname
join deposit
on customer.cname = deposit.cname
and customer.city = 'Nagpur'
join branch DBranch
on deposit.bname = DBranch.bname
此外,缩进显示了 table 的连接方式/位置。你可以看到它
customer
borrow
branch for borrow
deposit
branch for deposit
那么你总能看到下游的关系,而不是与其他人重叠/纵横交错。
最后一项是and customer.city = 'Nagpur'
。甚至不知道这是否是一项要求,但它在您的查询中。
我在数据库中有 4 个表,它们是:-
- 分支机构
- 存款
- 借
- 客户
查询:查找居住在那格浦尔市的客户的贷款号,贷款城市,存款账号,存款城市?
我在下面写了一个成功获取三个数据的查询。
- 贷款号
- 贷城
- 存款账号
但是在获取存款城市时,我得到了与贷款城市相同的数据。
下面我分享我的代码,以便您可以找到我错的地方
我试过的代码:
SELECT borrow.loanno,
branch.city AS 'Borrow city',
deposit.actno,
branch.city AS 'Deposit city',
customer.city As 'Customer_city'
FROM customer
JOIN borrow
ON borrow.cname = customer.cname
JOIN branch
ON borrow.bname = branch.bname
JOIN deposit
ON deposit.cname = customer.cname
AND customer.city = 'Nagpur';
通过运行上面的代码,我得到的输出是
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Mumbai 104 Nagpur
375 Mumbai Mumbai 105 Nagpur
我想要的输出是:-
loanno Borrow city Deposit city actno Customer_city
321 Mumbai Delhi 104 Nagpur
375 Mumbai Banglore 105 Nagpur
为了更好地理解,我正在分享我的 dB fiddle link 以便您清楚地了解。
请不要误会,但您所拥有的似乎不是一个好的数据库设计。通常,每个 table 都会有一个自动递增的基于整数的 ID 密钥,该密钥是唯一的并传递给每个基础 table。您的主键有字符串值。
我知道这看起来像是数据库设计的开始,但您确实需要一些帮助才能继续前进。
那么假设,您有 5 个名为“Anil”的人,那么您会怎么做...您完成了。 “Anil”是主键,您无法更改它。通过自动递增,您可以拥有 1000 个 Anil 客户,每个客户都有额外的信息以确保唯一性...名字、姓氏、地址和其他唯一信息。
现在开始查找分支 table。同样适用。你在孟买市有多个分支机构。会有重复的名字吗?可能的???因此,拥有一个 ID 列自动递增将解决问题,并且像客户这样的附加信息将确保像地址这样的唯一性。如“Kranti”分支。 “如果”你在 X 街有一个 Kranti 分支,而在 Y 街有一个 Kranti 分支,你可以安全地使用唯一的自动递增数字。
现在开始存款和借贷 tables。我知道它的样本数据,但只是为了展示 oops 是如何发生的。您的分行信息名称为“Chandani”,但您的存款 table 名称为“Chandni”(缺少第二个“a”)。我知道 o 型。
当您有数据输入屏幕并找到客户或分支机构时,系统将具有给定的记录“id”以存储在给定的存款或借贷中 table。不要根据 Anil 的客户示例中的字符串进行操作——如果您有 100 个 Anil 客户,请选择哪个示例。 ID 将确保正确的客户。与分支类似。应改为使用客户和分支机构的 ID 列(基于修改后的 database/table 结构)。
终于到你的查询了。您正在尝试将借款 table 与给定人员的存款结合起来。这只会让你头疼。没有存款保证借款(反之亦然)。现在,如果你有 5 次借款和 7 次存款给 Anil,你尝试查询这两种方式,你将得到 35 条记录被返回(笛卡尔积),因为对于借款中的每条记录 table匹配的客户将应用于这些存款。
所以,足够你考虑了,坐下来,深呼吸,消化一下。我可以向您展示一个更好的 table 结构来处理这里介绍的一些上下文。
至于写查询,你真的需要用简单的英语表达你想要得到什么,然后展示你是如何尝试的。此外,似乎没有匹配项,例如将存款应用于给定的借款,那么这有什么意义/逻辑。
再一次,真诚地面对你所面临的问题并愿意提供帮助,但你可能比你意识到的要远。
反馈
好吧,这是一个作业——一个糟糕的作业,但是 none-the-less。所以问题是你只使用了一个基于借款人的分支实例。你需要的是分行table加入TWICE...一次给借款人,一次给定金。在每一个中,我都给它“起了别名”。加入借用 table 时,我将其别名为“Bbranch”,表示“借用分支”。对于存款,我将“存款分行”别名为“DBranch”。于是每一个分别加入,这样每一个都会指向自己,分别拉城。
select
borrow.loanno,
BBranch.city as 'Borrow city',
deposit.actno,
DBranch.city as 'Deposit city',
customer.city
from
customer
join borrow
on customer.cname = borrow.cname
join Branch BBranch
on borrow.bname = BBranch.bname
join deposit
on customer.cname = deposit.cname
and customer.city = 'Nagpur'
join branch DBranch
on deposit.bname = DBranch.bname
此外,缩进显示了 table 的连接方式/位置。你可以看到它
customer
borrow
branch for borrow
deposit
branch for deposit
那么你总能看到下游的关系,而不是与其他人重叠/纵横交错。
最后一项是and customer.city = 'Nagpur'
。甚至不知道这是否是一项要求,但它在您的查询中。