如何使用连接从 mysql 中的单个 table 获取唯一数据?

How to use joins to fetch unique data from a single table in mysql?

我在数据库中有 4 个表,它们是:-

  1. 分支机构
  2. 存款
  3. 客户

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

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

  1. 贷款号
  2. 贷城
  3. 存款账号

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

下面我分享我的代码,以便您可以找到我错的地方

我试过的代码:

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 以便您清楚地了解。

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

请不要误会,但您所拥有的似乎不是一个好的数据库设计。通常,每个 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'。甚至不知道这是否是一项要求,但它在您的查询中。