Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 37
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473

    [SQL] query di utenti e gruppi

    Ciao a tutti.
    ho un db con una tabella UTENTI, GRUPPI, GRUPPI_UTENTI, dove devo gestire degli utenti che possono appartenere a diversi gruppi. Un utente puo' essere iscritto a piu gruppi.

    devo eseguire una query che deve resituire un elenco di tutti gli utenti della tabella UTENTI, con un campo espressione settato a 1 se l'utente appartiene al gruppo oppure a 0 se non appartienne al gruppo

    Esempio
    tabella Utenti: (ID, NOME)
    1 , pippo
    2 , franco
    3 , marco

    tabella Gruppi: (ID, gruppo)
    1 , impiegati
    2 , amministrativo

    tabella Gruppi_Utenti: (ID_utenti, ID_gruppi)
    1 , 1 (pippo appartiene al gruppo impiegati)
    2 , 1 (franco appartiene al gruppo impiegati)
    2 , 2 (franco appartiene al gruppo amministrativo)


    con la seguente query

    codice:
    SELECT UTENTI.ID, UTENTI.nome, "1" AS Espr1
    FROM UTENTI LEFT JOIN UTENTI_GRUPPI ON UTENTI.ID = UTENTI_GRUPPI.ID_utente
    WHERE (((UTENTI_GRUPPI.ID_gruppo)=1));
    union
    SELECT UTENTI.ID, UTENTI.nome, "0" AS Espr1
    FROM UTENTI LEFT JOIN UTENTI_GRUPPI ON UTENTI.ID = UTENTI_GRUPPI.ID_utente
    WHERE (((UTENTI_GRUPPI.ID_gruppo)<>1 Or (UTENTI_GRUPPI.ID_gruppo) Is Null));
    ottengo il seguente risultato:

    ID nome Espr1
    1 pippo 1
    2 franco 0
    2 franco 1
    3 marco 0

    invece vorrei riuscire ad ottenere

    ID nome Espr1
    1 pippo 1
    2 franco 1
    3 marco 0


    Grazie

    Ciao


  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473
    nessun idea???

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    39
    Ciao,
    alla fine della union raggruppi tutto per ID, NOME e prendi il MAX(Espr1).

    Oppure usi una sintassi del genere:

    SELECT DISTINCT UTENTI.ID, UTENTI.nome,
    CASE WHEN UTENTI_GRUPPI.ID_utente IS NOT NULL THEN 1
    ELSE 0
    END AS Espr1
    FROM UTENTI LEFT JOIN UTENTI_GRUPPI ON UTENTI.ID = UTENTI_GRUPPI.ID_utente

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473
    CIAO,
    grazie per la risposta.
    ho proato a fare il ragruppamento, ma max(espr1) non me lo accetta...

    Ho provato anche ad usare la seconda sintassi ma da un errore:
    errore di sintassi (operatore mancante) nell'espressione CASE WHEN UTENTI_GRUPPI.ID_utente IS NOT NULL THEN 1 ELSE 0 END AS Espr1

    Ho provato a mettere le parentesi nella condizione, ho provato a sostituire case con if ma ho sempre lo stesso errore

    Grazie

  5. #5
    ti basta UNA left join. se appartiene al gruppo, avrai il gruppo, altrimenti avrai null. a questo punto sotituisci il null con 0 e avrai il tuo risultato

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    39
    Immagino tu stia utilizzando MySQL,
    comunque il concetto è esattamente quello che ti ha spiegato optime, basta una sola LEFT JOIN, quelli che matchano avranno il campo UTENTI_GRUPPI.ID_utente valorizzato, gli altri a null.
    Da lì assegni un valore 0 o 1 al campo Espr1.

    Quando ho provato io le query ho creato i campi di id come int, quindi non ho emsso apici nella clausola CASE. Io ho provato su SQL SERVER, quindi fai le opportune modifiche se usi MySQL.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473
    Uso un banale mdb access e faccio una query tramite asp...
    Ora faccio un paio di prove con apici e no!

    Grazie

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473
    Ok ha funzionato!!!

    codice:
    SELECT UTENTI.ID, UTENTI.nome, UTENTI_GRUPPI.ID_utente, iif (UTENTI_GRUPPI.ID_utente IS NOT NULL, 1, 0) AS Espr1
    FROM UTENTI LEFT JOIN UTENTI_GRUPPI ON UTENTI.ID = UTENTI_GRUPPI.ID_utente
    GROUP BY UTENTI.ID, UTENTI.nome, UTENTI_GRUPPI.ID_utente;
    Grazie per l'aiuto, mi ero fissato sull'UNION e non avevo preso in considerazione di fare una banale left join!!

    Grazie tante!

    Ciao


  9. #9

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    473
    Ciao a tutti!

    Putroppo mi sono accorto solo ora che non funziona ancora bene la query che abbiamo fatto.
    Cosi come ho scritto la queri mi restituisce tutti gli utenti che fanno parte di almeno un gruppo, mentre io ho bisogno di sapere sato un determinato gruppo quali utenti fanno parte e quali no.

    Ho provato a modificare la query nel seguente modo:

    codice:
    SELECT UTENTI.ID, UTENTI.nome, IIf((([UTENTI_GRUPPI].[ID_gruppo])=1),1,0) AS Espr1
    FROM UTENTI LEFT JOIN UTENTI_GRUPPI ON UTENTI.ID = UTENTI_GRUPPI.ID_utente
    GROUP BY UTENTI.ID, UTENTI.nome, IIf((([UTENTI_GRUPPI].[ID_gruppo])=1),1,0);
    ma giustamente non funziona.
    nel primo post avevo spiegato esattamente la mia situazione e che cosa mi servirebbe.



    ottengo il seguente risultato:

    ID nome Espr1
    1 pippo 1
    2 franco 0
    2 franco 1
    3 marco 0

    invece vorrei riuscire ad ottenere

    ID nome Espr1
    1 pippo 1
    2 franco 1
    3 marco 0


    Grazie ancora per l'aiuto!

    Ciao

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.