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?
您应该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:消除不依赖于密钥的列
列customerName在Accounting表中不依赖于会计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)
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |