MySQL查询的GROUP BY部分中的布尔逻辑

时间:2012-01-24 20:28:25

标签: mysql sql

我目前有一个客户表,其中包含重复的客户。我想选择一个独特的客户列表,没有重复的家庭电话或手机。

因此,如果任何客户拥有与其他客户相同的家庭电话或手机,那么我希望不会从查询中返回该客户。

一个警告 - 如果家庭电话或手机是空的,那么我显然不想在反复制逻辑中计算它,因为有些客户只有家用电话,或者只有手机。

这是我当前的查询,它返回家庭电话和手机的唯一行。

SELECT id, firstname, lastname, homephone, cellphone, city, state, zip, 
country, FROM customers WHERE (homephone != "" OR cellphone != "")
GROUP BY homephone, cellphone

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

您必须将所有电话号码汇入 one 评估并按此排序/分组。

试试这个:

SELECT id, firstname, lastname, homephone, cellphone, city, state, zip, country
FROM customers
WHERE homephone != '' OR cellphone != ''
GROUP BY case when homephone = '' then cellphone else homephone end

它将获得为“家庭电话的每个唯一值找到的第一行,但如果是空白然后手机”

答案 1 :(得分:1)

如果两个客户拥有相同的非空家庭电话或相同的非空手机,则此查询将丢弃具有较大id的那个:

SELECT id, firstname, ...
  FROM customers c1
 WHERE (c1.homephone != '' OR c1.cellphone != '')
   AND (    c1.homephone = ''
         OR NOT EXISTS
             ( SELECT 1
                 FROM customers c2
                WHERE c2.id < c1.id
                  AND c2.homephone = c1.homephone
             )
       )
   AND (    c1.cellphone = ''
         OR NOT EXISTS
             ( SELECT 1
                 FROM customers c3
                WHERE c3.id < c1.id
                  AND c3.cellphone = c1.cellphone
             )
       )
;

请注意,如果客户X与客户Y具有相同的主页电话,但与客户Z具有相同的单元电话,则可能会产生病态结果。