2017-07-06 46 views
0

我有一个查询获取有关客户的一些数据。这个客户可以有三个电话号码,这些可以重复。MYSQL计数次数值在3列中的次数

要计算的次数,这些手机都是重复的合作伙伴已创建一个子查询:

(select count(*) 
from TABLE_A as k 
where (k.phone=a.phone or k.phone2=a.phone or k.phone3=a.phone) 
and k.id!=a.id) as repetitionsPhone1 

这里面一个更大的选择是这样的:

SELECT a.*,c.*,b.*, 
    (
     select count(*) 
     from TABLE_A as k 
     where (k.phone=a.phone or k.phone2=a.phone or k.phone3=a.phone) 
     and k.id!=a.id 
    ) as repetitionsPhone1 
    FROM a 
    left join c on a.id=c.id 
    left join b on a.id=b.id 

此查询时间为50行约30秒,每天应该返回约2000行。

优化这个我用explain,我看到那么我搜索,我想这该子查询是问题:

SELECT phn,sum(count) as phoneRepetitions 
from (
    select k.phone1 as phn, count(*) as count 
    from k 
    group by k.phone1 
     UNION 
    select k.phone2 as phn,count(*) as count 
    from k 
    group by k.phone2 
     UNION 
    select k.phone3 as phn,count(*) as count 
    from k 
    group by k.phone3 
) as aux 
    group by phn 

这将返回#1062 MYSQL error: Duplicate entry for key 'distinct key'

首先,我想解决的这个问题。任何人都知道发生了什么?这个错误在插入语句中似乎是逻辑的,但在选择?

然后,这将有助于改善我必须优化的大选择吗?我将不得不为三列进行此操作。

谢谢。

+0

工会不会使它更有效率肯定 – Dimgold

+0

@Dimgold感谢您的回答。你知道解决方案吗? – Maik

+0

我不确定你可以使用相同的别名将表合并到自己表中吗? E.G你会为每个工会需要不同的别名吗?像 选择k.phone1如PHN,用k从ALTAS_DET K2 组从ALTAS_DET K1计数(*)作为计数 组由k.phone1 UNION 选择k.phone2作为PHN,COUNT(*)作为计数 .phone2 UNION 选择k.phone3为PHN,由k.phone3 –

回答

0
SELECT 
COUNT(*) AS CountOf FROM 
    table1 
    INNER JOIN 
table2 
GROUP BY phone1 , phone2 , phone3 
HAVING COUNT(*) > 1