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

Php 连接两个表的最佳方法,其中1仅用于匹配,php,mysql,Php,Mysql,我已经做了一个多小时了,我感到很沮丧。 我有两个表,我在做一个查询,其中一个表仅用于检查单个条件,但目前我在第二个表中找到的条目都会得到重复的结果 表: 客户及 发票 第一个查询-获取所有人: Select cust_id FROM Customers WHERE clinic_id='$clinic' 这很好,只是一个简单的查询。。。我的下一个目标是加入第二个表,并仅在过去18个月内发现发票的地方显示结果 查询: Select Customers.cust_id FROM Custo

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

表: 客户及 发票

第一个查询-获取所有人:

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张发票时


如何修改查询以实现此目的?

我想展示两种获得您描述的结果的方法

首先,如果您只想显示有发票的客户,您可能希望切换到内部联接,而不是左联接。这将使所有没有任何发票的客户从您的结果中消失,据我所知,这是您想要归档的内容。有关联接的差异的更多信息,请参阅

一,。明显的

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

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'
二,。分组

您可以使用来归档相同的效果,这通常是在您汇总其中的某些内容时使用的,例如,清点账单或汇总账单

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

最有效的方法是使用现有的:

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'
             );