Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Inner Join

  1. #1

    Inner Join

    Salve a tutti,
    ho 2 tabelle in relazione tra loro tramite ID
    codice:
    CLIENTI
    ----------------------------
    ID_Cliente   Nome
    1            Pino
    2            Lino
    3            Rino
    
    Orari
    ----------------------------------------------------------------
    ID_Cliente Tipo          Ora
    1          ENTRATA       2006-09-06 08:00:00
    1          USCITA        2006-09-06 12:00:00
    Vorrei eseguire una query che mi restituisse un solo record con i campi ENTRATA e USCITA con gli orari.
    mi spiego meglio
    Se eseguo questa query
    codice:
    SELECT C.ID_Cliente, C.Nome, O.Ora 
       FROM Clienti C INNER JOIN Orari O ON C.ID_Cliente = O.ID_Cliente 
          WHERE ID_Cliente = 1 AND O.Tipo = 'ENTRATA'
    mi restituirebbe il seguente record
    codice:
    ID_Cliente   Nome   Ora
    1            Pino   2006-09-06 08:00:00
    Se tolgo la clausola
    codice:
    AND O.Tipo = 'ENTRATA'
    mi ritorna 2 record.
    Se tolgo la clausola WHERE mi ritorna + record per ogni Cliente.
    Come posso fare per ottenere come risultato della query un solo record del genere ?
    codice:
    ID_Cliente   Nome   ENTRATA               USCITA
    1            Pino   2006-09-06 08:00:00   2006-09-06 12:00:00
    E se lo stesso cliente avesse piu' orari di Entrata ed Uscita come posso ottenere lo stesso
    record con il primo orario di entrata e l'ultimo orario di uscita?
    Tutto questo l'ho fatto da codice utilizzando una query nella tab clienti e, per ogni ID_Cliente,
    usare una query nella tab Orari. Per una tabella con centinaia di clienti, le query aumentano.
    Vorrei sapere se si puo' fare con una query sola sfruttando MySQL
    Forse mi sono un po' dilungato ma credo di aver esposto bene il problema
    Grazie
    Un saluto a tutti

  2. #2
    codice:
    SELECT a.id, nome, uno.data as entrata, max(due.data) as uscita
    FROM `clienti` a
    left join orari uno on a.id = uno.id and uno.tipo = 'Entrata'
    left join orari due on a.id = due.id and due.tipo = 'Uscita'
    WHERE a.id = 1
    group by a.id

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

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da piero.mac
    codice:
    min(uno.data)

  4. #4
    Ho provato la tua query e funziona alla grande
    Rispetto ai miei tentativi fatti devo ammettere che ero distante dalla soluzione anni luce!

    Complimenti, sei stato grande

    Grazie

  5. #5
    a proposito di min e max... non l'ho detto per non complicare la vita, ma si presume che i dati vengano rimossi od aggiornati dopo l'uso altrimenti diventeranno presto fasulli. il min sara' sempre min() , mentre il max avanzera'. tanto per intenderci. Forse servira' un altro parametro in where, magari un "between da a" che identifichi il periodo di osservazione.

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

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.