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

    Ricerca su relazione molti-a-molti

    Salve a tutti, vi espongo il mio problema (sono agli inizi e ne sto uscendo matto):
    Ho tre tabelle (semplifico)
    codice:
    Utente
    - id
    - nome
    Gruppo
    - id
    - nome
    Utente_gruppo
    - id_utente
    - id_gruppo
    Ora, ogni gruppo può essere associato ad ogni utente e ogni utente può avere associati più gruppi. E fin quì tutto bene! Il problema si presenta quando devo creare un sistema di ricerca dinamico per visualizzare tutti gli utenti con dei gruppi associati, MENO i gruppi selezionati dal form di ricerca (una semplice lista di checkbox generata dinamicamente contenente come value l'id di ogni gruppo da escludere nella ricerca).

    Tralasciando la parte di PHP (già funzionante) in cui genero le checkbox, la query che sto provando ora è la seguente:
    codice:
    SELECT DISTINCT(u.id), u.nome
    FROM Utente u
    JOIN Utente_Gruppo ug ON ug.id_utente = u.id
    JOIN Gruppo g ON g.id = cg.gruppo_id
    WHERE g.id NOT IN (1, 2, 3, etc {lista dei gruppi id generata dinamicamente in base alla ricerca selezionata})
    ORDER BY u.nome
    La query sembra funzionare (funziona solo se ogni utente ha un solo gruppo associato), il problema è che se ci sono utenti con anche altri gruppi associati OLTRE a quello escluso nella ricerca, mi compare ugualmente nei risultati (e non è quello che vorrei).

    In questo caso per farlo scomparire dai risultati, devo selezionare TUTTI i gruppi a cui è associato, mentre io vorrei che ne bastasse anche uno solo selezionato per escluderlo (anche perchè attualmente ho circa 500 utenti e un totale di circa 30 gruppi, dove ogni utente ha una media di 10 gruppi associati…impensabile selezionarli tutti ogni volta).

    Per dirla a parole: "Nascondi tutti gli utenti che hanno il/i seguente/i gruppo/i associato/i, a prescindere con quali altri è in relazione: {lista gruppo/i da escludere}"

    Spero di essermi spiegato chiaramente...Vi ringrazio anticipatamente per le dritte, ma da solo non ci arrivo e ci sto perdendo la ragione!
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  2. #2
    se puoi fare tabelle temporanee, estrai tutti gli associati in una temp e poi togli (cancelli) dalla temp gli indesiderati; alla fine, fai una select della temp

  3. #3
    Intanto grazie per la risposta. Perdonami, sono agli inizi Mi sento molto ignorante..Cos'è una tabella temporanea? E' strettamente necessaria (lo chiedo per ignoranza) o si può, nel caso, risolvere anche con strumenti base (altre join o subquery etc. )?
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  4. #4
    da' un'occhiata qui http://www.html.it/articoli/mysql-ge...lle-tabelle-1/

    io consiglio l'uso delle temp (almeno in M$SQL), non so se con mySql ci sono controindicazioni

  5. #5
    Molto interessante, ti ringrazio. Ho fatto qualche prova direttamente nel mio spazio mysql ma continua a darmi errore, ho il dubbio che non gradisca queste tabelle temporanee..In alternativa posso seguire altre strade modificando la query che ho postato oppure sono del tutto fuori strada? Grazie mille!
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  6. #6
    Ciao,

    Potresti pensare di risolvere il problema nel seguente modo :

    Fai una query che ti estrae gli utenti (id) appartenenti ai gruppi generati dinamicamente.

    A questo punto nella select principale scriverai :

    SELECT u.nome
    ....
    ....
    WHERE u.id not in( query impostata sopra )

  7. #7
    Ti ringrazio, funziona tutto!
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

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.