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

ang*_*gus 2 php mysql sql database-design

表客户

id     fName        lName      pNumber
 1     Adeline      Brown      55512300
 2     May          Green      55512094 
Run Code Online (Sandbox Code Playgroud)

表会计

id     customerName       datePaid        amount
1      Brown, Adeline     2012-08-09      210
2      Green, May         2012-09-09      430   
Run Code Online (Sandbox Code Playgroud)

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

Mah*_*mal 5

您应该customerName从Accounting表中删除它,并将其替换为CustomerId.但是,就目前而言,您可以JOIN使用任何谓词作为JOIN条件的两个表,如下所示:

SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.fName + ', ' + p.lName = ac.customerName
Run Code Online (Sandbox Code Playgroud)

你的表Accouting结构的问题是,它没有 规范化,特别是,不符合第三范式3NF,即:

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

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

客户表:

  • id,fName,lName,pNumber.

会计表:

  • id,customerId外键引用Customers(Id),datePaid,amount.

然后你可以JOIN直接使用ON customerId这两个表来提高性能:

SELECT c.pNumber
FROM Customers c
INNER JOIN accounting ac ON c.Id = ac.CustomerId
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)