如何从一个表中选择数据,其中该表中的列值与另一个表的连续列值匹配?

时间:2012-09-18 10:29:57

标签: php mysql sql database-design

表客户

id     fName        lName      pNumber
 1     Adeline      Brown      55512300
 2     May          Green      55512094 

表会计

id     customerName       datePaid        amount
1      Brown, Adeline     2012-08-09      210
2      Green, May         2012-09-09      430   

我的问题是如何根据与pNumber对应的datePaid选择customerName

1 个答案:

答案 0 :(得分:5)

您应从Accounting表中删除customerName,并将其替换为CustomerId。但是,就目前而言,您可以使用任何谓词JOIN JOIN两个表作为SELECT c.pNumber FROM Customers c INNER JOIN accounting ac ON c.fName + ', ' + p.lName = ac.customerName 条件,如下所示:

Accouting

您的表customerName结构的问题在于,不是 normalized,尤其是,不符合第三种正常形式 3NF 即:

  

3NF:消除不依赖于密钥的列

Accounting表中的列id不依赖于该表的会计id。所以,你的表应该是这样的:

客户表:

  • fNamelNamepNumberid

会计表:

  • customerIdCustomers(Id)外键引用datePaidamountJOIN

然后你可以ON customerId直接SELECT c.pNumber FROM Customers c INNER JOIN accounting ac ON c.Id = ac.CustomerId 两个表SELECT c.pNumber FROM customers c INNER JOIN ( SELECT DISTINCT id, customerName, datePaid, amount TO_DAYS(DATE(datePaid)) - TO_DAYS(CURDATE()) AS DaysFromPayment FROM Accounting ) ac ON c.last_name + ', ' + c.first_name = ac.customerName WHERE ac.DaysFromPayment = 30 ,这将极大地提高性能:

{{1}}

修改:查询中没有任何错误。可能是您没有符合此条件的任何行。您可以尝试以下查询,它与您编写的内容相同,但更有条理:

{{1}}