2016-12-15 61 views
-3

我有三个表,用户(包括用户详细信息),territory_categories(其中有不同的地域名称和它们的ID),user_territorySQL QUERY给了我想要的输出,但花费很长时间来加载输出。我如何优化它?

我想根据选择的领土过滤用户(两者结合表)从列表中。

查询是 -

SELECT u.id,account_id_fk,first_name,last_name,email_address,password,mobile_number,gender,user_accuracy,check_in_radius,report_to,role,allow_timeout, 
    active,last_logged_on,last_known_location_time,last_known_location,u.created_on,u.created_by, 
(SELECT COUNT(DISTINCT u2.id) FROM fieldsense.users u2 
INNER JOIN user_territory t1 ON u2.id=t1.user_id_fk 
INNER JOIN territory_categories c on c.id=t1.teritory_id 
**WHERE c.category_name LIKE** "Gujarat" AND(u2.account_id_fk=1 AND u2.role!=0)) AS usersCount, 
IFNULL(a.id,0) attendanceId,IFNULL(a.punch_date,'1111-11-11') punchInDate,IFNULL(a.punch_in,0) punchIntime,IFNULL(a.punch_out_date,'1111-11-11') punchOutDate, IFNULL(a.punch_out,0) punchOutTime 
FROM fieldsense.users as u 
LEFT OUTER JOIN attendances as a ON u.id=a.user_id_fk AND a.id=(select max(id) from attendances att where att.user_id_fk=u.id) 
INNER JOIN user_territory t1 ON u.id=t1.user_id_fk 
INNER JOIN territory_categories c on c.id=t1.teritory_id 
**WHERE c.category_name LIKE "Gujarat"** 
GROUP BY u.id **limit 10** 

OUTPUT:

usersCount: 136 
     attendanceId: 0 
     punchInDate: 1111-11-11 
     punchIntime: 0 
     punchOutDate: 1111-11-11 
     punchOutTime: 0 
    10 rows in set (2.06 sec) 

而且没有where子句时,它加载它需要近1分钟,显示数据

OUTPUT无条款:

usersCount: 144 
     attendanceId: 0 
     punchInDate: 1111-11-11 
     punchIntime: 0 
     punchOutDate: 1111-11-11 
     punchOutTime: 0 
    10 rows in set (54.45 sec) 

我正在得到所需的输出,但查询花费了将近1分钟来加载,我想优化。我怎样才能做到这一点 ?

+1

这不是一个Java问题......请为亲爱的任何事物的爱,*格式化您的代码*。格式化为 – JonK

+0

。请为此提供良好的解决方案。迫切需要它的解决方案 –

回答

0

试试看。我只是缩小了表user_territory的内部联接,因此它不会加入整个user_territory表,但只会加入不同的user_id。希望它能缩短性能时间,

SELECT u.id, 
account_id_fk, 
first_name, 
last_name, 
email_address, 
PASSWORD, 
mobile_number, 
gender, 
user_accuracy, 
check_in_radius, 
report_to, 
role, 
allow_timeout, 
active, 
last_logged_on, 
last_known_location_time, 
last_known_location, 
u.created_on, 
u.created_by, 
(
    SELECT 
     COUNT(u2.id) 
    FROM 
     fieldsense.users u2 
    INNER JOIN (SELECT DISTINCT user_id_fk as id, territory_id FROM user_territory) t1 ON u2.id = t1.id 
    INNER JOIN territory_categories c ON c.id = t1.teritory_id 
    WHERE 
     c.category_name LIKE "Gujarat" 
    AND (
     u2.account_id_fk = 1 
     AND u2.role != 0 
    ) 
) AS usersCount, 
IFNULL(a.id, 0) attendanceId, 
IFNULL(a.punch_date, '1111-11-11') punchInDate, 
IFNULL(a.punch_in, 0) punchIntime, 
IFNULL(
    a.punch_out_date, 
    '1111-11-11' 
) punchOutDate, 
IFNULL(a.punch_out, 0) punchOutTime 
FROM 
    fieldsense.users AS u 
LEFT OUTER JOIN attendances AS a ON u.id = a.user_id_fk 
AND a.id = (
    SELECT 
     max(id) 
    FROM 
     attendances att 
    WHERE 
     att.user_id_fk = u.id 
) 
INNER JOIN (SELECT DISTINCT user_id_fk as id, territory_id FROM user_territory) t1 ON u2.id = t1.id 
INNER JOIN territory_categories c ON c.id = t1.teritory_id 
WHERE 
    c.category_name LIKE "Gujarat" 
GROUP BY 
    u.id 
LIMIT 10 
相关问题