Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema con SELECT DISTINCT

    Salve ragazzi, cercherò di essere il meno prolisso possibile.
    Sostanzialmente ho la seguente query:

    SELECT DISTINCT P.ID, P.Status, P.Totale, C.Cognome, CA.ID AS Idcarta FROM prenotazione AS P, cliente AS C, relativa AS R, porto AS PO, associata AS A, gestisce AS G, operatore AS O, emette AS E, cartaimbarco AS CA WHERE P.ID = R.IDprenotazione AND R.IDCliente = C.ID AND P.ID = A.IDPrenotazione AND A.NomePorto = PO.Nome AND P.ID = G.IDPrenotazione AND G.IDOperatore = O.ID AND O.ID = E.IDOperatore AND E.IDCarta = CA.ID AND (P.Status = 'E' OR P.Status = 'R')

    Ed il risultato che ottengo è il seguente:

    ID "Status" "Totale" "Cognome" "Idcarta"
    108 "E", "43" "Latella" 110
    108 "E" "43" "Latella" 111
    109 "E" "43" "Latella" 110
    109 "E" "43" "Latella" 111

    Effettivamente la clausula DISTINCT fa il suo sporco lavoro, però io vorrei che il risultato fosse questo:

    ID "Status" "Totale" "Cognome" "Idcarta"
    108 "E", "43" "Latella" 110
    109 "E" "43" "Latella" 111

    Qualcuno saprebbe suggerirmi un piccolo trucchetto per ottenere ciò? Grazie in anticipo per le risposte.
    Here Comes The Music Ecstasy

  2. #2

    Re: Problema con SELECT DISTINCT

    con quale criterio decidi di ottenere

    108 "E", "43" "Latella" 110

    da

    108 "E", "43" "Latella" 110
    108 "E" "43" "Latella" 111


    e

    109 "E" "43" "Latella" 111

    da

    109 "E" "43" "Latella" 110
    109 "E" "43" "Latella" 111

    ???? se non spieghi questo, sarà difficile aiutarti

    ID "Status" "Totale" "Cognome" "Idcarta"

    Qualcuno saprebbe suggerirmi un piccolo trucchetto per ottenere ciò? Grazie in anticipo per le risposte. [/QUOTE]

  3. #3
    Ciao, bhè il problema è proprio questo. Fondamentalmente alla prenotazione con ID 108 corrisponde la carta di imbarco numero 110, mentre alla prenotazione con ID 109 corrisponde la carta di imbarco numero 111. Il problema si verifica solo quando nella SELECT DISTINCT inserisco come parametro CA.ID as Idcarta, restituendomi più volte lo stesso ID della prenotazione e lo stesso numero di carta d'imbarco. Questo è corretto in quanto la clausula DISTINCT valuta il contenuto di ogni riga e quindi
    108 E 43 Latella 110
    è diversa da
    108 E 43 Latella 111
    Però in realtà alla prenotazione 108 dovrebbe corrispondere solo il numero di carta d'imbarco 110 e non anche il 111...
    Se hai bisogno di ulteriori dettagli chiedi pure...
    Here Comes The Music Ecstasy

  4. #4
    ma se tu 'umano' ti trovi di fronte a questi quattro records scritti sulla carta

    108 "E", "43" "Latella" 110
    108 "E" "43" "Latella" 111
    109 "E" "43" "Latella" 110
    109 "E" "43" "Latella" 111

    con quale ragionamento estrai

    108 "E", "43" "Latella" 110
    109 "E" "43" "Latella" 111

    a naso?

  5. #5
    Si, in effetti hai ragione, non conoscendo le strutture delle tabelle coinvolte nella SELECT è normale che non possiate darmi alcuna risposta. Purtroppo conoscendo a fondo il problema che vi ho descritto do per scontate delle cose che in realtà non lo sono per niente. Provo quindi a descrivervi la struttura delle tabelle coinvolte:

    prenotazione (ID, Nome, Cognome, Telefono1, Telefono2, Totale, Status)

    gestisce (IDPrenotazione, IDOperatore)

    operatore (ID, Cognome)

    emette (IDOperatore, IDcarta)

    cartaimbarco (IDCarta)

    Ecco uno schema (a grandi linee)

    prenotazione -> gestisce (sarebbe stato più corretto chiamarla "viene gestita" ) -> operatore -> emette -> cartaimbarco

    Se ad esempio entrambe le carte di imbarco vengono emesse dall'operatore con ID pari a 1, non ho modo di identificare quale sia effettivamente la carta di imbarco che si riferisce alla specifica prenotazione.

    Secondo me si potrebbe aggiungere il campo IDPrenotazione alla tabella emette, proprio per identificare univocamente la prenotazione a cui si riferisce la carta di imbarco. Secondo voi è un'operazione pulita o si potrebbe fare di meglio?
    Here Comes The Music Ecstasy

  6. #6
    quindi i quattro record

    108 "E", "43" "Latella" 110
    108 "E" "43" "Latella" 111
    109 "E" "43" "Latella" 110
    109 "E" "43" "Latella" 111

    indicano che l'operatore (108 o 109) ha usato la carta (110 o 111), ma non si sa per quale motivo (prenotazione)

    se è così, certo, devi aggiungere la prenotazione

  7. #7
    No, i quattro record indicano che l'operatore 1 ha effettuato la prenotazione 108 e 109 e che ha emesso le carte d'imbarco 110 e 111
    Comunque grazie per l'aiuto
    PS: a questo punto per la tabella emette utilizzerei come chiave tutti e 3 i campi, ovvero IDOperatore, IDCarta ed IDPrenotazione...
    Here Comes The Music Ecstasy

  8. #8
    quindi in qualche modo è sbagliata la query, perché ad una prenotazione deve corrispondere una sola carta d'imbarco

  9. #9
    Originariamente inviato da optime
    quindi in qualche modo è sbagliata la query, perché ad una prenotazione deve corrispondere una sola carta d'imbarco
    Si, la query giusta dopo la modifica della tabella "emette" è la seguente:
    SELECT DISTINCT P.ID, P.Status, P.Totale, C.Cognome, CA.ID AS Idcarta FROM prenotazione AS P, cliente AS C, relativa AS R, porto AS PO, associata AS A, gestisce AS G, operatore AS O, emette AS E, cartaimbarco AS CA WHERE P.ID = R.IDprenotazione AND R.IDCliente = C.ID AND P.ID = A.IDPrenotazione AND A.NomePorto = PO.Nome AND P.ID = G.IDPrenotazione AND G.IDOperatore = O.ID AND O.ID = E.IDOperatore AND E.IDCarta = CA.ID AND P.ID = E.IDPrenotazione AND (P.Status = 'E' OR P.Status = 'R')
    Here Comes The Music Ecstasy

  10. #10
    Ciao,

    come da regolamento va inserito il nome della piattaforma usata per il database (mysql, mssql, firebird, postgresql e via dicendo) nel titolo.

    Se posti il nome correggo inoltre, gentilmente, dai un occhio al regolamento

    Grazie
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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.