【发布时间】:2017-05-08 18:24:24
【问题描述】:
我正在开发 MySql 数据库。我需要将多个(超过 10 个)表中的信息合并到一个表中。为了做到这一点,我遵循典型的加入风格。
Select * from
table_1
Join table_2
on(table_1.id = table_2.id)
Join table_3
on(table_1.id = table_3.id)
它有效,但我在执行期间遭受了很多痛苦。还有其他优化我的代码的好方法吗?以下是我的代码示例:
SELECT
distinct
u.Id,
oc.dt,
Daily_Number_Outgoing_Calls,
Daily_Number_Incoming_Calls,
Daily_duration_Outgoing_Calls
FROM
creditfix.users u
JOIN
#1 Daily_No_Out_Calls
(
SELECT
cl.uId,SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Outgoing_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=2 #out going calls only
GROUP by cl.uId,dt
) oc
ON (u.Id=oc.Uid)
#2 Daily_No_In_Calls
JOIN
(
SELECT
cl.uId, SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Incoming_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=1 #incoming calls only
GROUP by cl.uId,dt
) ic
ON (u.Id=ic.Uid)
#3 Daily_duration_Out_Calls
JOIN
(
SELECT
cl.uId,SUBSTRING(DATE,1,10) as dt,
(sum(duration)) as Daily_duration_Outgoing_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=2 #out going calls only
GROUP by cl.uId,dt
) od
ON (u.Id=od.uid)
# It goes on like this...
【问题讨论】:
-
请改掉在
GROUP BY中使用列号而不是名称的习惯,这会使查询更难阅读。 -
而且当你编辑代码时会变得脆弱,以防你在
SELECT列表中插入列。 -
性能问题是因为您不仅要加入表,还要加入子查询。它们不像真正的表那样有索引,所以它们很难让 MySQL 优化。
-
@Barmar 嗨,我是新手并在我的代码中进行了编辑 :) 感谢您的 cmets
-
@Barmar 有没有办法为此类查询编制索引?
标签: mysql sql join subquery dbeaver