2016-07-04 11 views
0

SQLクエリに問題があり、それは私に必要な出力を与え、コンピュータで正常に動作しますが、私のデータベースを学校のPCで実行する必要があるため、問題。クエリには34が必要です!SQLクエリが遅く実行される

enter image description here

クエリは次のとおりです:あなたは1人の担当者最大(MAX(Carico))を見つける必要が私のPC上で、それはこれが私のDBである6

のように必要としながら、実行すべき秒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; 

出力は少し異なる(代わりに、NEの余分な列と4行)になりますが、その多くの方: ような何か。それをテストして、あなたのニーズにまだ合っているかどうかを確認できますか?

0

私は今私の答えをすべて変更し、あなたのデータでそれを新しく書きました。

まずあなたが

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

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

2新しいindexeを作成する必要があり、その後、あなたがこれを実行することができます。結果が同じであることをテストしてください。 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; 

:-)実行時間を参照してくださいサンプル

中 あなたはNULLを持っている代わりに0変更 、0) にしたい場合は、NULL)

インデックスを作成

MariaDB [yourschema]> ALTER TABLE programma 
    -> ADD KEY `idx_nRipetizioni` (`nRipetizioni`,`ID_Scheda`,`Esercizio`); 

Query OK, 0 rows affected (0.27 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

インデックス

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

関連する問題