连接两个表的最佳方法,其中1仅用于匹配

时间:2015-04-02 21:17:19

标签: php mysql

我已经有一个多小时了,我很沮丧。 我有两个表,我正在进行查询,其中一个表仅用于检查单个条件,但是目前我在第二个表中找到了重复的结果。

表: 顾客& 发票

First Query - 获取所有人:

Select cust_id 
FROM Customers 
WHERE clinic_id='$clinic' 

这样做很好,只是一个简单的查询...我的下一个目标是加入第二个表格,并仅显示过去18个月内发现发票的结果。

查询:

Select Customers.cust_id 
FROM Customers 
LEFT JOIN Invoices 
ON Customers.cust_id=Invoices.cust_id 
WHERE Customers.clinic_id='$clinic' 
AND Invoices.invoice_date > '$cutoffdate'

这为我提供了过去18个月内找到的每张发票的结果,因此如果一个人有5张发票,那么该人将被退回5次。

我需要查询才能让每个人只返回一次,并且只有在过去18个月内找到至少1张发票的时候。

如何修改查询以执行此操作?

2 个答案:

答案 0 :(得分:0)

我想展示两种方法来获得你描述的结果。

首先,如果您只想显示有发票的客户,您可能希望切换为INNER JOIN而不是LEFT JOIN。这将使所有没有任何发票的客户离开您的结果,并且据我所知这是您要存档的内容。有关JOIN的差异的更多信息,请参阅here

<强> 1。 DISTINCT

只需在DISTINCT之后添加SELECT,它就会指定从结果集中删除重复的行。

SELECT DISTINCT C.cust_id 
FROM Customers C
INNER JOIN Invoices I ON C.cust_id = I.cust_id 
WHERE C.clinic_id='$clinic' 
    AND I.invoice_date > '$cutoffdate'

<强> 2。 GROUP BY

您可以使用GROUP BY来达到相同的效果,这通常在您聚合某些内容时使用,例如:计算账单或总结它们。

SELECT C.cust_id 
FROM Customers C
INNER JOIN Invoices I ON C.cust_id = I.cust_id 
WHERE C.clinic_id='$clinic' 
    AND I.invoice_date > '$cutoffdate'
GROUP BY C.cust_id

答案 1 :(得分:0)

最有效的方法是使用exists

Select c.cust_id 
FROM Customers c 
WHERE EXISTS (SELECT 1
              FROM Invoices i
              WHERE c.cust_id = i.cust_id AND
                    c.clinic_id = '$clinic' AND
                    i.invoice_date > '$cutoffdate'
             );