Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18

    Outer join che non funge

    Ciao a tutti, non riesco proprio a fare una join banale, di cui mi serve solo il numero con mysql_num_rows.

    Ho due tabelle:
    utenti | ricevute

    Con questi e altri campi
    codice | cod_ut
    nome | quota
    | data

    Vorrei avere i numeri secchi di quanti utenti hanno pagato la quota e faccio così, ottenendo un numero verosimile:

    SELECT ricevute.*, utenti.*
    FROM ricevute
    INNER JOIN utenti ON ricevute.cod_ut = utenti.codice
    WHERE ricevute.quota != ' ' AND YEAR(primanot.data) = '$anno'";



    E vorrei avere il numero secco di quanti non hanno pagato la quota e dunque di quanti sui 7000 non hanno ricevute con valorizzato il campo quota.
    Sto impazzendo ma proprio non ci riesco.

    Ho provato così:

    SELECT *
    FROM utenti
    LEFT JOIN ricevute
    ON utenti.codice = ricevute.cod_ut

    Ebbene quando conto con mysql_num_rows, mi viene restituito un numero molto più grande degli utenti presenti (circa 7000) e quindi più simile al numero di ricevute presenti in ricevute.

    Grazie a tutti per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Prova cosi

    SELECT *
    FROM utenti
    LEFT JOIN ricevute
    ON utenti.codice = ricevute.cod_ut
    WHERE ricevute.cod_ut is null

    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    Innanzitutto, grazie. Purtroppo il numero è troppo basso per essere verosimile (con la soluzione da te suggerita, esce 585).

    Facendo prove, il numero più verosimile (oltre 6000) lo ottengo così, ma non so se sia effettivamente e logicamente corretto:

    SELECT * FROM utenti WHERE codice NOT IN (SELECT cod_ut FROM ricevute WHERE quota != ' ' AND YEAR(ricevute.data) = '$anno');

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    Penso sia corretto, perché quando tolgo il NOT, ottengo altro numero che sommato al precedente è il numero degli utenti totali.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    Qualcuno saprebbe come aggiungere una where clause a quella query? Cioè se volessi fare un where relativo alla tabella utenti

    SELECT *
    FROM utenti
    WHERE codice
    NOT IN
    (SELECT cod_ut FROM ricevute WHERE quota != ' ' AND YEAR(ricevute.data) = '$anno');

  6. #6
    nella query di badaze c'è già una where, arricchiscila

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    grazie mille per la risposta.

    In realtà è esattamente come dici. Purtroppo avevo un campo chiamato DEC che a quanto pare non doveva chiamarsi così. Superfagiano!!!
    Grazie ancora

  8. #8
    fa' il bravo, posta la query corretta

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    SELECT *
    FROM confra
    WHERE CODICE2 IN (SELECT COD_CONF FROM primanot WHERE QUOTA != '0.00' AND YEAR(DATA_REGIS) = '$anno')
    AND DECED != '1'
    AND YEAR(DATA_ISCR) <= '$anno'
    ORDER BY NOME ASC

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    18
    La query funziona in effetti, ma non fa esattamente quello che dovrebbe, in quanto, secondo me, le tabelle sono mal pensate, e purtroppo si tratta di un db in access migrato in mysql di cui non potrei alterare la struttura per non perdere i dati di un ventennio.

    Questa query mi trova tutti gli utenti che hanno pagato una quota di iscrizione (QUOTA_ISCR != ''), in un dato anno (la data delle ricevute è DATA_REGIS) e verifico anche che il PERIODO (campo descrittivo di altro che si chiama ARRETRATI) non contenga il dato ANNO, per valutare se quello è stato pagato come arretrato.
    Quello che mi rovina è che una persona può aver pagato nel 2015, il 2013 ecc. e non esiste nei dati un campo che indichi la causale di QUOTA_ISCR.
    Quindi se una persona paga solo l'anno in corso, la ricevuta riempie solo QUOTA_ISCR. Se uno paga anche arretrati, QUOTA_ISCR resta vuoto e viene valorizzato ARRETRATI e PERIODO.

    Sto impazzendo, ma non penso ci sia una soluzione, per sapere quanti utenti non hanno pagato il 2014 (anche con data del 2015)

    P.S. solo un ente benefico può aver fatto una cosa del genere, naturalmente

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 © 2026 vBulletin Solutions, Inc. All rights reserved.