首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个表的优化方法查询结果

问使用多个表的优化方法查询结果
EN

Stack Overflow用户
提问于 2016-12-29 08:52:28
回答 2查看 43关注 0票数 0

我正在尝试使用4个表来获取数据。表列表

  • 数字
  • 呼叫
  • ref_label_no
  • 标签

我想获取带有特定标签的电话号码的数据。这是桌子。

数字表:

代码语言:javascript
复制
select id,uuid,number from numbers limit 1;
+----+--------------------------------------+------------+
| id | uuid                                 | number     |
+----+--------------------------------------+------------+
|  1 | ed268b05-758e-44fd-b429-8d5223651814 | 1234561222 |
+----+--------------------------------------+------------+

调用表

代码语言:javascript
复制
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表

代码语言:javascript
复制
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)

标签表

代码语言:javascript
复制
mysql> select uuid,name from labels limit 1;
+--------------------------------------+-------+
| uuid                                 | name  |
+--------------------------------------+-------+
| 7262b06e-9263-4825-8411-4c107104a60b | INDIA |
+--------------------------------------+-------+
1 row in set (0.00 sec)

现在我想要结果,就像我所需要的总calls.This输出的调用号一样

代码语言:javascript
复制
mysql> select uuid,name from labels limit 1;
+--------------------------------------+-------+
| Number                       | Total_calls  |
+--------------------------------------+-------+
| 13456789                     |       2      |
+--------------------------------------+-------+
1 row in set (0.00 sec)

我已经做了以下的查询,但没有成功,也需要太多的时间来回应。

代码语言:javascript
复制
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;

有什么建议或建议吗?

EN

回答 2

Stack Overflow用户

发布于 2016-12-29 09:02:04

多个表避免使用联接,请使用Union。它会比加入快。

像这样,

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-12-29 09:09:34

代码语言:javascript
复制
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,因为它与聚合函数计数相冲突。

以下查询使用存在条件:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41376143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档