如何使用连接来获取唯一的数据从一个表在mysql?



我在数据库中有4个表:-

<
  1. 分支/gh>存款借
  2. 客户

查询:找到那些住在那格浦尔市的客户的贷款号码,贷款城市,存款账号,存款城市?

我在下面写了一个查询,成功地获取了三个数据。

贷款没有
  1. 贷款城市
  2. 存款账号

但是在获取存款城市时,我得到与贷款城市相同的数据。

下面我将分享我的代码,这样你就可以发现我错在哪里

My trying code:

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小提琴链接,这样你就有了一个清晰的想法。

https://www.db-fiddle.com/f/gaUYxuwuJLsWA4kFeMn9u6/6

请不要误会,但你所拥有的似乎不是一个好的数据库设计。通常,每个表都有一个基于自动增量整数的ID键,该键是唯一的,并传递到每个底层表。您的主键有字符串值。

我知道这看起来像是数据库设计的开始,但是你真的需要一些帮助。

比如说,你有5个人叫"阿尼尔",你会怎么做……你完成了。"Anil"是主键,你不能改变它。通过自动增量,您可以有1000个Anil客户,每个客户都有额外的信息来确保唯一性……名字,姓氏,地址,其他唯一信息

现在进入分支查找表。同样适用。你们在孟买有多家分行。会有重复的名字吗?可能吗? ?因此,拥有一个自动递增的ID列可以解决这个问题,而像客户这样的附加信息可以确保像地址这样的唯一性。比如"克朗提";分支。"IF"现在来存放和借用桌子。我知道它的样本数据,但只是为了说明错误是如何发生的。您的分行信息名称为"钱德拉尼",但您的存款表名称为"钱德拉尼"。(漏掉了第二个"a")。I know type-o.

当您有数据输入屏幕并找到客户或分支机构时,系统将具有给定的"id";要存储在给定的存借表中的记录的。不要基于每个Anil客户示例的字符串——如果你有100个Anil客户。ID将确保正确的客户。类似于branch。应该使用customer和branch的ID列(基于修改后的数据库/表结构)。

最后你的查询。您正在尝试将借阅表与给定人员的存款连接起来。这只会让你头疼。借款不能保证有存款(反之亦然)。现在,如果您对Anil有5次借款和7次存款,并且尝试以您拥有的方式查询这两项,您将得到返回的35条记录(笛卡尔积),因为借款表中具有匹配客户的每条记录都将应用于这些存款。

所以,足够让你考虑,坐下来,深呼吸,消化它。我可以向您展示一个更好的表结构来处理这里提供的一些上下文。

至于写查询,你真的需要用简单的英语来表达你想要得到什么,然后展示你是如何尝试的。而且,似乎没有匹配,比如存款被应用到给定的借款中,那么这里的重点/逻辑是什么?

再次,真诚地面对你所面临的困难,并愿意帮助你,但你可能比你意识到的要远。

反馈好了,这是一个赋值——一个糟糕的赋值,但还是一个赋值。问题是你只使用了一个基于借款人的分支实例。你需要的是分支表连接两次…一次给借方,一次给定金。在每一篇文章中,我都使用了"别名"。它。在加入借阅表时,我将其别名为"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

还显示了缩进,以查看表如何/在何处连接。你可以看到它变成了

customer
borrow
branch for borrow
deposit
branch for deposit

那么你总是可以看到下游的关系,而不是重叠/交叉。

最后一项是and customer.city = 'Nagpur'。我甚至不知道这是否是一个要求,但它是在你的查询。

相关内容

  • 没有找到相关文章

最新更新