2016-12-29 19 views
0

我想使用4个表获取数据。 名单表的使用多个表优化方式的查询结果

  • 数字
  • 电话
  • ref_label_no
  • 标签

我想获取没有来电的号码附有特定标签的数据。 这里是表格。
号码表

select id,uuid,number from numbers limit 1; 
+----+--------------------------------------+------------+ 
| id | uuid         | number  | 
+----+--------------------------------------+------------+ 
| 1 | ed268b05-758e-44fd-b429-8d5223651814 | 1234561222 | 
+----+--------------------------------------+------------+ 

调用表

mysql> select id,uuid,did from calls limit 2; 
+----+-------------------------------------+------------+ 
| id | uuid        | number  | 
+----+-------------------------------------+------------+ 
| 1 | ddddass-b810-4f23-7456-8ff56efab080 | 1234561222 | 
| 2 | dddddd-b810-4f23-7456-8ff56efab080 | 123456789 | 
+----+-------------------------------------+------------+ 
2 rows in set (0.02 sec) 

ref_label_no表

mysql> select uuid,number_uuid,label_uuid from ref_label_no limit 1; 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| uuid         | number_uuid       | label_uuid       | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| 7a5e1b6e-0194-4993-8d78-5f7a1b60c7d2 | ed268b05-758e-44fd-b429-8d5223651814 | 7262b06e-9263-4825-8411-4c107104a60b | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
1 row in set (0.00 sec) 

标签表

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| uuid         | name | 
+--------------------------------------+-------+ 
| 7262b06e-9263-4825-8411-4c107104a60b | INDIA | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

现在我想导致像总接来电号码。[这个输出,我需要]

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| Number      | Total_calls | 
+--------------------------------------+-------+ 
| 13456789      |  2  | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

我做了下面的查询,但没有成功也花费过多时间来响应。

select count(*) as Total_calls,calls.number as did,labels.name,calls.created_at as callstart from calls, labels JOIN ref_label_no ON labels.uuid = ref_label_no.label_uuid JOIN numbers ON numbers.uuid = ref_label_no.number_uuid where labels.name="INDIA" group by calls.number; 

任何意见或建议?

+0

不'ref_label_no'表起到什么作用?为什么你在使用UUID时似乎还在这些表上有一个自动增量列。如果使用UUID,则不需要自动增加 – e4c5

+0

ref_label_no表包含所有参考值(如数字标签和数字表uuid),我们正在使用不基于主键的uuid的参考值。 –

+0

对不起,评论不是很清楚 – e4c5

回答

0

多个表格避免使用连接,使用联合。它会比加入更快。

这样,

select uuid,did from calls union 
select uuid,number_uuid as did from ref_label_no union 
select uuid,name as did from labels 
+0

但我的结果也显示错误,只想从调用表中得到结果,但想要按标签过滤,使用Union的任何引用查询? –

+0

哪里适用条件?我应该使用表别名吗? –

0
SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM numbers JOIN calls ON numbers.number = calls.number 
JOIN ref_label_no ON ref_label_no.number_uuid = numbers.uuid 
JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" 
GROUP BY numbers.number; 

因为我们计算的呼叫通过数字分组的总数,你会不会在查询结果中选择calls.created_at的能力,因为它与冲突聚合函数COUNT。

下面的查询使用EXISTS条件:

SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM calls JOIN numbers ON numbers.number = calls.number 
WHERE EXISTS(SELECT 1 FROM ref_label_no JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" AND numbers.uuid = ref_label_no.number_uuid) 
GROUP BY numbers.number; 
+0

使用此查询,在我的调用表中有大约1 lk记录,并且需要大约8分钟才能获取记录。对我来说这不起作用。 –

+0

你的桌子上有什么索引?表中缺乏索引是主要的性能杀手。它是否给你返回正确的结果? – bean

+0

现在应用索引。就像我们这个查询在“20行(7.64秒)”次中获取记录一样。仍然是7秒很大的数。 –