Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 51
  1. #1

    Problema join query complicate

    Buongiorno programmatori,
    ho un problema in php e sql,

    in pratica ho una pagina php in cui calcolo alcuni dati e li inserisco in una tabella,

    il mio problema però è che vorrei unire 2 query complicate in modo da migliorarne le performance che attualmente risultano molto lente sul DB,

    il mio codice php con le query è questo:

    prima query
    codice:
    SELECT
    sync.id_allievo AS id_allievo,
    COUNT(sync.id_allievo) AS Schede,
    LI.Domande AS Domande,
    IFNULL(LI.errori, 0) Errori
    FROM sync
    LEFT JOIN allievo A ON A.id_allievo = sync.id_allievo
    LEFT JOIN clientescuola CS ON CS.id_clienteScuola = A.id_clienteScuola
    LEFT join listato LI ON LI.tipo = A.listatoQuiz
    WHERE ((sync._Stato <> "D") AND (sync._Stato <> "X") AND (sync.tipo = "TipoEsame"))
    AND CS.id_sedeClienteNeca = ' . $id_sedeClienteNeca . '
    AND sync.id_allievo = ' . $id_allievo . '
    GROUP BY sync.id_allievo';


    $rows = NecaDB::arraySQL(null, $sql);

    seconda query:

    codice:
    $sql2= "SELECT AVG(Media) as MediaErrori FROM (SELECT errori as Media FROM sync WHERE id_allievo= ". $id_allievo . " AND tipo = 'TipoEsame' ORDER BY `sync`.`dataFine` DESC Limit 15 )as MediaErrori";

    il campo Errori della prima deve essere sostituito dal campo MediaErrori della seconda, come posso unire le 2 query per ottenere una tabella con i seguenti campi:
    id_allievo Schede Domande MediaErrori

  2. #2
    metti la seconda come subquery in join della prima. ma non credere di migliorare le performance aggiungendo una join a meno che non spieghi bene dove perdi velocotà

  3. #3
    perdo velocità ogni volta che interrogo la tabella sync che ha più di 90 milioni di righe.... ma al momento non può essere toccata..

    C' è un modo per ottenere la mia query facendo una sola passata sulla tabella sync invece che 2 come in questo caso?

  4. #4
    come fare te l'ho detto, provaci e vediamo

  5. #5
    SELECT
    sync.id_allievo AS id_allievo,
    COUNT(sync.id_allievo) AS Schede,
    LI.Domande AS Domande,
    IFNULL(LI.errori, 0) MediaErrori
    FROM sync
    LEFT JOIN allievo A ON A.id_allievo = sync.id_allievo
    LEFT JOIN clientescuola CS ON CS.id_clienteScuola = A.id_clienteScuola
    LEFT join listato LI ON LI.tipo = A.listatoQuiz
    JOIN
    (SELECT AVG(Media) as MediaErrori FROM (SELECT errori as Media FROM sync WHERE id_allievo= ". $id_allievo . " AND tipo = 'TipoEsame' ORDER BY `sync`.`dataFine` DESC Limit 15 )as MediaErrori
    ) MediaErrori
    WHERE ((sync._Stato <> "D") AND (sync._Stato <> "X") AND (sync.tipo = "TipoEsame"))
    AND CS.id_sedeClienteNeca = 5111
    AND sync.id_allievo = 345266
    GROUP BY sync.id_allievo

  6. #6
    SELECT
    sync.id_allievo AS id_allievo,
    COUNT(sync.id_allievo) AS Schede,
    LI.Domande AS Domande,
    IFNULL(LI.errori, 0) Errori

    MediaErrori


    FROM sync
    LEFT JOIN allievo A ON A.id_allievo = sync.id_allievo
    LEFT JOIN clientescuola CS ON CS.id_clienteScuola = A.id_clienteScuola
    LEFT join listato LI ON LI.tipo = A.listatoQuiz
    JOIN
    (SELECT AVG(Media) as MediaErrori FROM (SELECT errori as Media FROM sync WHERE id_allievo= ". $id_allievo . " AND tipo = 'TipoEsame' ORDER BY `sync`.`dataFine` DESC Limit 15 )as MediaErrori
    WHERE ((sync._Stato <> "D") AND (sync._Stato <> "X") AND (sync.tipo = "TipoEsame"))
    AND CS.id_sedeClienteNeca = 5111
    AND sync.id_allievo = 345266
    GROUP BY sync.id_allievo

  7. #7
    Alla fine ho trovato la soluzione, ma la velocità di caricamento della pagina non è cambiata, le prestazioni sono rimaste uguali!


    $sql = 'SELECT
    sync.id_allievo AS id_allievo,
    COUNT(sync.id_allievo) AS Schede,
    LI.Domande AS Domande,
    IFNULL(LI.errori, 0) Errori,
    IFNULL (MediaErrori,0) MediaErrori
    FROM sync
    LEFT JOIN allievo A ON A.id_allievo = sync.id_allievo
    LEFT JOIN clientescuola CS ON CS.id_clienteScuola = A.id_clienteScuola
    LEFT join listato LI ON LI.tipo = A.listatoQuiz
    JOIN
    (SELECT AVG(Media) as MediaErrori FROM
    (SELECT errori as Media FROM sync WHERE id_allievo='. $id_allievo . ' AND tipo = "TipoEsame"
    ORDER BY `sync`.`dataFine` DESC Limit 15 )as MediaErrori
    ) MediaErrori
    WHERE ((sync._Stato <> "D") AND (sync._Stato <> "X") AND (sync.tipo = "TipoEsame"))
    AND CS.id_sedeClienteNeca = '. $id_sedeClienteNeca . '
    AND sync.id_allievo = '. $id_allievo . '
    GROUP BY sync.id_allievo';

  8. #8
    è già tanto che non sia peggiorata, visto che hai aggiunto una ulteriore JOIN

    accertati comunque che tutte le colonne dove fai JOIN o WHERE siano indicizzate.

    Curiosità: perché fai GROUP BY sync.id_allievo' se leggi un allievo solo?

  9. #9
    C è un modo per fare la stessa cosa senza join?
    leggo tutte le schede di quell' allievo!

  10. #10
    la mia domanda era per la GROUP BY, non per le JOIN... comunque, hai controllato gli indici? Poi, di quanto tempo stiamo parlando per fare una interrogazione?

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.