2016-07-04 4 views
0

SQL 쿼리에 문제가 있습니다. 원하는 결과를 얻을 수 있으며 컴퓨터가 정상적으로 작동하지만 학교의 PC에서 데이터베이스를 실행해야하므로 문제. 쿼리에 34 명이 필요합니다!SQL 쿼리 실행 속도가 느림

enter image description here

쿼리는 다음과 같습니다 : 내 PC에 6.

처럼 필요 동안 초이 내 DB이며, 실행되는 당신은 한 대표 최대를 찾을 수있다 (최대 (Carico)) 5 년 넘게 체육관 회원이었던 각 사용자에 대한 "Panca Orizzontale", "Squat", "Estensioni Bilanciere", "Squat"

SELECT U.Nome 
    , U.Cognome 
    , MAX(P1.Carico) AS MaxPanca_Orizzontale 
    , MAX(P2.Carico) AS MaxSquat 
    , MAX(P3.Carico) AS MaxEstensioni_Bilanciere 
    , MAX(P4.Carico) AS MaxLento_Avanti 
    FROM utente AS U 
    left 
    join scheda AS S1 
    on U.CF=S1.ID_Utente 
    left 
    join programma AS P1 
    on S1.ID_Scheda = P1.ID_Scheda 
    AND P1.nRipetizioni = 1 
    AND P1.Esercizio = "Panca Orizzontale" 
    left 
    join scheda AS S2 
    on U.CF=S2.ID_Utente 
    left 
    join programma AS P2 
    on S2.ID_Scheda = P2.ID_Scheda 
    AND P2.nRipetizioni = 1 
    AND P2.Esercizio = "Squat" 
    left 
    join scheda AS S3 
    on U.CF = S3.ID_Utente 
    left 
    join programma AS P3 
    on S3.ID_Scheda = P3.ID_Scheda 
    AND P3.nRipetizioni = 1 
    AND P3.Esercizio = "Estensioni Bilanciere" 
    left 
    join scheda AS S4 
    on U.CF = S4.ID_Utente 
    left 
    join programma AS P4 
    on S4.ID_Scheda = P4.ID_Scheda 
    AND P4.nRipetizioni = 1 
    AND P4.Esercizio = "Lento Avanti" 
WHERE U.CF IN(SELECT U.CF 
       FROM utente U 
       WHERE Data_Iscrizione < date_sub(curdate(), interval 5 year) 
      ) 
GROUP 
    BY U.Nome 
    , U.Cognome; 

원하는 결과입니다 :

내가 사용하고 쿼리입니다

enter image description here

은 아마 모든 문제 조인, 그것을 만들 수있는 방법이있다 실행 속도가 더 빠름 ?? 시간 내 주셔서 감사합니다

+1

당신이 tablestructures 일부 샘플 데이터를 제공 할 수있는 쿼리를 운영하는 인덱스를 생성? – Philipp

+0

... 원하는 결과. – Strawberry

+0

원하는 결과를 추가했습니다. 이제 테이블 생성을 시도합니다. – LucaPearl

답변

0

나는 programma.Esercizio를 그룹에 추가하는 것이 좋습니다. 같은 뭔가 :

SELECT U.Nome, U.Cognome, P.Esercizio, MAX(Carico) AS MaxCarico 
FROM utente AS U left join scheda AS S1 on U.CF=S1.ID_Utente 
left join programma AS P1 on S1.ID_Scheda=P1.ID_Scheda AND P1.nRipetizioni=1 
WHERE U.CF IN(SELECT U.CF FROM utente U WHERE Data_Iscrizione < date_sub(curdate(), interval 5 year)) 
GROUP BY U.Nome, U.Cognome, P.Esercizio; 

출력은 조금 다른 (추가 열 대신 네브라스카의 4 행)이 될 것이지만, 더 나은 그것의 많은 데이터베이스 서버에 대한 사전 처리 할 수 ​​있습니다. 그것을 테스트 해보고 그것이 여전히 당신의 필요에 맞는지보실 수 있습니까?

0

나는 내 대답을 모두 바꿔서 데이터로 새로 작성했습니다.

먼저이 새로운 indexe에게

ALTER TABLE programma 
ADD KEY `idx_nRipetizioni` (`nRipetizioni`,`ID_Scheda`,`Esercizio`); 

ALTER TABLE utente 
ADD KEY `idx_ata_Iscrizione` (`Data_Iscrizione`); 

를 작성해야하고이를 실행할 수 있습니다. 그 결과가 똑같은지 시험해보십시오. 대신 0 변화 , 0) , NULL) 의 NULL을하려는 경우 if 문

SELECT 
    U.Nome, 
    U.Cognome, 
    MAX(IF(P1.Esercizio="Panca Orizzontale",P1.Carico,0)) AS MaxPanca_Orizzontale, 
    MAX(IF(P1.Esercizio="Squat",P1.Carico,0)) AS MaxSquat, 
    MAX(IF(P1.Esercizio="Estensioni Bilanciere",P1.Carico,0)) AS MaxEstensioni_Bilanciere, 
    MAX(IF(P1.Esercizio="Lento Avanti",P1.Carico,0)) AS MaxLento_Avanti 
FROM utente AS U 
LEFT JOIN scheda AS S1 ON U.CF=S1.ID_Utente 
LEFT JOIN programma AS P1 ON S1.ID_Scheda=P1.ID_Scheda 
      AND P1.nRipetizioni=1 
WHERE Data_Iscrizione < date_sub(curdate(), INTERVAL 5 YEAR) 
GROUP BY U.Nome, 
     U.Cognome; 

샘플

:-) 실행 시간을 참조

색인 만들기

MariaDB [yourschema]> ALTER TABLE utente 
    -> ADD KEY `idx_ata_Iscrizione` (`Data_Iscrizione`); 
Query OK, 0 rows affected, 1 warning (0.08 sec) 
Records: 0 Duplicates: 0 Warnings: 1 

MariaDB [yourschema]> SELECT 
    -> U.Nome, 
    -> U.Cognome, 
    -> MAX(IF(P1.Esercizio="Panca Orizzontale",P1.Carico,0)) AS MaxPanca_Orizzontale, 
    -> MAX(IF(P1.Esercizio="Squat",P1.Carico,0)) AS MaxSquat, 
    -> MAX(IF(P1.Esercizio="Estensioni Bilanciere",P1.Carico,0)) AS MaxEstensioni_Bilanciere, 
    -> MAX(IF(P1.Esercizio="Lento Avanti",P1.Carico,0)) AS MaxLento_Avanti 
    -> FROM utente AS U 
    -> LEFT JOIN scheda AS S1 ON U.CF=S1.ID_Utente 
    -> LEFT JOIN programma AS P1 ON S1.ID_Scheda=P1.ID_Scheda 
    ->   AND P1.nRipetizioni=1 
    -> WHERE Data_Iscrizione < date_sub(curdate(), INTERVAL 5 YEAR) 
    -> GROUP BY U.Nome, 
    ->   U.Cognome; 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
| Nome  | Cognome  | MaxPanca_Orizzontale | MaxSquat | MaxEstensioni_Bilanciere | MaxLento_Avanti | 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
| Ajeje  | Brazov  |     0.0 | 100.0 |      0.0 |   35.0 | 
| Aldo  | Baglio  |     80.0 | 120.0 |      32.5 |   50.0 | 
| Fernando | Torres  |     0.0 | 150.0 |      0.0 |   35.0 | 
| Francesco | Toldo  |     90.0 |  0.0 |      40.0 |    0.0 | 
| Giovanni | Storti  |     65.0 |  0.0 |      0.0 |   30.0 | 
| Guendalina | Porte  |     0.0 |  50.0 |      20.0 |   25.0 | 
| Harry  | Potter  |    150.0 | 180.0 |      80.0 |   122.5 | 
| John  | Cena   |    135.0 | 240.0 |      60.0 |   75.5 | 
| Kevin  | Velociraptor |     0.0 |  0.0 |      20.0 |   95.0 | 
| Luciano | Spalletti |     60.0 | 280.0 |      95.0 |   100.0 | 
| Marcella | Mandria  |     0.0 |  50.0 |      0.0 |   27.5 | 
| Marcelo | Zalayeta  |    140.0 | 200.0 |      55.0 |   60.0 | 
| Radja  | Nainggolan |     90.0 | 120.0 |      0.0 |   40.0 | 
| Romina  | Power  |     0.0 |  0.0 |     140.0 |   20.0 | 
+------------+--------------+----------------------+----------+--------------------------+-----------------+ 
14 rows in set (0.00 sec) 

MariaDB [yourschema]> 
+0

입니다. 시도했지만 오류가 발생했습니다. # 1248 - 모든 파생 테이블에 고유 한 별칭이 있어야합니다. – LucaPearl

+0

@LucaPearl - 이제 내 대답에 오류가 수정되었습니다. 다시 확인해주세요. 데이터가 없습니다 –

+0

아무 것도 작동하지 않습니다. 이것은 이것이 보여주는 것입니다. https://i.gyazo.com/43316678aac5c90bd302f2d5f83d0c7c.png – LucaPearl

관련 문제