Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Join tra tabelle

  1. #1

    Join tra tabelle

    Ho una tabella 'richieste' nella quale memorizzo le richieste di preventivo fatte da clienti ed una tabella 'preventivi' nella quale memorizzo i preventivi inviati per ciascuna richiesta.
    Le due tabelle sono legate dall' 'id' di richiesta.

    Per ogni richiesta possone essere inviati più preventivi.
    Per esempio alla richiesta con id numero 1 possono corrispondere più preventivi.

    Quando un preventivo viene accettato lo spunto come 'evaso'.
    La tabella preventivi ha un campo ENUM con nome 'evaso' e con valori 1 e 0.

    Come posso selezionare mediante un join tra tabelle solo le richieste che non hanno un preventivo evaso?

    Mi spiego meglio.

    Se faccio:
    SELECT * FROM richieste INNER JOIN preventivi ON richieste.id=preventivi.id_richiesta WHERE preventivi.evaso='0'

    mi ritorna l'elenco completo di tutte le richieste, perchè ogni richiesta avendo preventivi multipli ne ha sicuramente almeno uno non evaso e quindi a valore 0.

    Come faccio a d indicare che se un solo preventivo appartenente alla stessa richiesta è evaso e quindi a valore 1 non mi deve selezionare la richiesta?

  2. #2
    forse ci sono soluzioni migliori con una subquery ma anche la seguente potrebbe funzionare:

    codice:
    SELECT *, if(preventivi.evaso = 1, 1, 0) as stato 
    FROM richieste 
    INNER JOIN preventivi ON richieste.id=preventivi.id_richiesta 
    WHERE preventivi.evaso=0
    HAVING stato = 0

    @ edit

    rileggendola la query ma anche no.... perche' ti renderebbe la stessa lista.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Prova con la subquery:

    codice:
    SELECT *
    FROM richieste 
    INNER JOIN preventivi ON richieste.id=preventivi.id_richiesta 
    WHERE preventivi.id_richiesta NOT IN 
          (select id_richiesta from preventivi
           WHERE preventivi.evaso = 1
           group by id_richiesta)
    Oppure prova con IN() e preventivi.evaso = 0 ... insomma giu' di li, fai prove...

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Ho provato la prima query ma non funziona perchè mi restituisce nulla.

    La seconda query probabilmente funziona ma non ne ho visto il risultato perchè impiega troppo tempo e dopo alcuni minuti di attesa interrompevo il processo.
    Dopotutto non si può aspettare mezzora l'apertura di una pagina.

    Scindendo la query ho ottenuto quello che volevo.

    Ho separato la sub query, inserendo tutti i risultati ottenuti in una stringa separata da virgole, mediante i comandi php while per creare un array e implode per estrarre l'array in una stringa. Potevo farla più semplice ma ho preferito creare l'array e poi scompattarlo...

    Quindi ho inserito la stringa nella query sql usando come mi hai suggerito il NOT IN (.......)

    Funziona benissimo.... Grazie!

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.