2012-08-01 129 views
0

我有一个客户表和一个地址表。每个客户在地址表中可以有多个条目,但只有其中一个条目可以标记为“主要”。我已经把查询拉起客户和他们的主地址如下:mysql左连接多列where

SELECT * FROM customers LEFT JOIN addresses 
     ON customers.cust_id = addresses.cust_id 
WHERE customers.status = 1 AND addresses.primary = 1 

我发现一个缺陷中,如果客户还没有添加一个地址到他们的帐户,他们不会因为没有“主要”地址而出现。

解决此问题的最佳方法是什么?

回答

0
SELECT * 
FROM  customers 
LEFT JOIN addresses 
ON  customers.cust_id = addresses.cust_id 
AND  1     = addresses.primary 
WHERE  customers.status = 1 
+0

辉煌。没有意识到你可以在这样的JOIN中使用AND。谢谢! – TH1981 2012-08-01 21:26:14

+1

是的,你可以使用任何表达式;函数,甚至子查询。但是,为了获得最佳性能,请坚持列对比和/或常量。上面的查询将正常工作;可能更好或者与其他人提出的“OR”构建一样好。不过,我觉得这种说法更清晰,更清晰,不太冗长。 – 2012-08-01 21:29:02

0

尝试修改查询到AND (addresses.primary = 1 OR addresses.primary IS NULL)

0

只要为左侧的数据时,没有地址。
在下面的示例中,我使用主字段,但在没有匹配关键字的情况下,左连接子句中的任何字段的表格
都为空。

SELECT * FROM customers LEFT JOIN addresses 
     ON customers.cust_id = addresses.cust_id 
WHERE customers.status = 1 AND 
     (addresses.primary = 1 OR addresses.primary IS Null)