Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    MySql conteggio errato con left join

    Buongiorno,

    se eseguo questa query:

    codice:
    SELECT COUNT(*) AS tot_giornate,
    SUM( IF ( sottoeventi_personale.modalita = 'r',1,0 ) ) AS tot_r,
    SUM( IF ( sottoeventi_personale.modalita = 'm',1,0 ) ) AS tot_m,
    SUM( IF ( sottoeventi_personale.modalita = 't',1,0 ) ) AS tot_t,
    SUM( IF ( sottoeventi_personale.modalita = 'p',1,0 ) ) AS tot_p,
    SUM( IF ( sottoeventi_personale.data_sottoevento = giorni_festivi.data,1,0 ) ) AS tot_festive,
    sottoeventi.id_evento,
    giorni_festivi.data
    									   
    FROM sottoeventi_personale
    								   
    LEFT JOIN sottoeventi
    ON sottoeventi_personale.id_sottoevento=sottoeventi.id
    								   
    LEFT JOIN eventi
    ON sottoeventi.id_evento=eventi.id
    									   
    LEFT JOIN giorni_festivi
    ON sottoeventi_personale.data_sottoevento=giorni_festivi.data
    								   
    WHERE sottoeventi.id_evento='".posts('id_evento_h')."'
    								   
    AND sottoeventi_personale.id_personale<>0
    Funziona tutto ed ottengo i giusti totali dei giorni festivi, feriali e totali, se invece aggiungo:

    codice:
    SELECT COUNT(*) AS tot_giornate,
    SUM( IF ( sottoeventi_personale.modalita = 'r',1,0 ) ) AS tot_r,
    SUM( IF ( sottoeventi_personale.modalita = 'm',1,0 ) ) AS tot_m,
    SUM( IF ( sottoeventi_personale.modalita = 't',1,0 ) ) AS tot_t,
    SUM( IF ( sottoeventi_personale.modalita = 'p',1,0 ) ) AS tot_p,
    SUM( IF ( sottoeventi_personale.data_sottoevento = giorni_festivi.data,1,0 ) ) AS tot_festive,
    SUM( sellout.prezzo_unitario * sellout.quantita ) AS tot_sellout,
    SUM( sellout.quantita ) AS tot_pezzi_sellout,
    sottoeventi.id_evento,
    giorni_festivi.data
    									   
    FROM sottoeventi_personale
    								   
    LEFT JOIN sottoeventi
    ON sottoeventi_personale.id_sottoevento=sottoeventi.id
    								   
    LEFT JOIN eventi
    ON sottoeventi.id_evento=eventi.id
    									   
    LEFT JOIN giorni_festivi
    ON sottoeventi_personale.data_sottoevento=giorni_festivi.data
    									   
    LEFT JOIN sellout
    ON sottoeventi_personale.data_sottoevento=sellout.data_sottoevento
    								   
    WHERE sottoeventi.id_evento='".posts('id_evento_h')."'
    								   
    AND sottoeventi_personale.id_personale<>0
    Mi ritrovo i totali dei giorni sballato, in media un giorno in più.....

    Sapreste darmi una mano a capire dove sabglio?

    Grazie

    SK

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Una parola senza un dump su cui testare.
    Comunque leggiti questo articolo

    http://dev.mysql.com/doc/refman/5.0/...imization.html

    e vedi se ti è d'aiuto. Si tratta sicuramente di un problema di parentesi.

  3. #3
    Originariamente inviato da nicola75ss
    Una parola senza un dump su cui testare.
    Comunque leggiti questo articolo

    http://dev.mysql.com/doc/refman/5.0/...imization.html

    e vedi se ti è d'aiuto. Si tratta sicuramente di un problema di parentesi.
    Ehhhh, ho letto, ma......non ci ho capito molto

    Se ti dumpo le tabelle coinvolte hai tempo e voglia di darci un occhio?

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Cerca di riprodurre lo scenario ridotto ai minimi termini.

    Quindi posta il dump delle tabelle e le relative insert con pochi record per ciascuna, non migliaia.

    Vediamo così se io o qualcun altro riusciamo a trovare l'inghippo.

  5. #5
    Originariamente inviato da nicola75ss
    Cerca di riprodurre lo scenario ridotto ai minimi termini.

    Quindi posta il dump delle tabelle e le relative insert con pochi record per ciascuna, non migliaia.

    Vediamo così se io o qualcun altro riusciamo a trovare l'inghippo.
    Ah guarda in locale lavoro su pochi record, altrimenti non mi ritrovo più

    Il file lo trovate QUI


  6. #6
    Il fatto è che andando avanti devo comporre dinamicamente la query, ovvero ampliare la query, e di join ve ne saranno altri, e se non mi funziona gia qui, figuriamoci dopo

    Io ho riletto l'articolo, ma non riesco a capire dove dovrei mettere ste benedette parentesi

  7. #7
    Allora così:

    codice:
    SELECT COUNT(*) AS tot_giornate,
    SUM( IF ( sottoeventi_personale.modalita = 'r',1,0 ) ) AS tot_r,
    SUM( IF ( sottoeventi_personale.modalita = 'm',1,0 ) ) AS tot_m,
    SUM( IF ( sottoeventi_personale.modalita = 't',1,0 ) ) AS tot_t,
    SUM( IF ( sottoeventi_personale.modalita = 'p',1,0 ) ) AS tot_p,
    SUM( IF ( sottoeventi_personale.data_sottoevento = giorni_festivi.data,1,0 ) ) AS tot_festive,
    SUM( sellout.prezzo_unitario * sellout.quantita ) AS tot_sellout,
    SUM( sellout.quantita ) AS tot_pezzi_sellout,
    sottoeventi.id_evento,
    giorni_festivi.data
    									   
    FROM sottoeventi_personale
    									   
    LEFT JOIN sottoeventi
    ON sottoeventi_personale.id_sottoevento=sottoeventi.id
    									   
    LEFT JOIN  ( eventi, giorni_festivi, sellout )
    ON ( sottoeventi.id_evento=eventi.id AND sottoeventi_personale.data_sottoevento=giorni_festivi.data AND sottoeventi_personale.data_sottoevento=sellout.data_sottoevento )
    									   
    WHERE sottoeventi.id_evento='".posts('id_evento_h')."'
    									   
    AND sottoeventi_personale.id_personale<>0
    Tira fuori i giorni festivi, feriali e totali giusti, la quantità di R,M,T,P corrette, ma il sellout e il totale pezzi sono completamente errati

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.