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

    [MySQL] - SELECT su due tabelle

    Di nuovo ciao a tutti... questa è la settimana delle domande stupide (probabilmente)

    Quest'oggi mi sono impantanato qui:

    - tabella PERSONE (id - nominativo)
    - tabella COMPRAVENDITE (id1 - id2)

    (sempre rappresentazione fittizia del problema reale... per ovvi motivi di dati sensibili)

    la tabella COMPRAVENDITE definisce semplicemente chi ha comprato (id1) e chi ha venduto (id2); entrambi gli indici fanno riferimento all' ID della tabella PERSONE (ovviamente)

    Gia avrete capito che devo fare: ricavare i nominativi della tabella compravendite in modo da ottenere un elenco formato da coppie di nominativi (chi ha venduto e chi ha comprato)

    ps: non trovo uno smile adatto... quello di chi si vergogna a fare simili domande...

    forse questo:

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: [MySQL] - SELECT su due tabelle

    Originariamente inviato da gasparirob
    Di nuovo ciao a tutti... questa è la settimana delle domande stupide (probabilmente)

    Quest'oggi mi sono impantanato qui:

    - tabella PERSONE (id - nominativo)
    - tabella COMPRAVENDITE (id1 - id2)

    (sempre rappresentazione fittizia del problema reale... per ovvi motivi di dati sensibili)

    la tabella COMPRAVENDITE definisce semplicemente chi ha comprato (id1) e chi ha venduto (id2); entrambi gli indici fanno riferimento all' ID della tabella PERSONE (ovviamente)

    Gia avrete capito che devo fare: ricavare i nominativi della tabella compravendite in modo da ottenere un elenco formato da coppie di nominativi (chi ha venduto e chi ha comprato)

    ps: non trovo uno smile adatto... quello di chi si vergogna a fare simili domande...

    forse questo:
    Tutta colpa del caldo

    codice:
    SELECT acq.nominativo, ven.nominativo
    FROM compravendite c
    JOIN persone acq
    ON c.id1 = acq.id
    JOIN persone ven
    ON c.id2 = ven.id

  3. #3

    Re: Re: [MySQL] - SELECT su due tabelle

    Originariamente inviato da Joe Taras
    Tutta colpa del caldo
    Si sicuramente... sicuramente è colpa del caldo e non della mia ignoranza..


    ps: grazie, funge perfettamente...

    ps2: nel caso volessi ottenere un risultato anche per elementi null della seconda colonna? (la prima colonna non puo contenere valori null, la seconda si, quindi in quel caso vorrò avere "PINCO PALLINO - NULL")

  4. #4
    Forse mi rispondo da solo:
    LEFT join sul secondo join

  5. #5
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da gasparirob
    Forse mi rispondo da solo:
    LEFT join sul secondo join
    esatto

  6. #6
    Eccomi di nuovo...

    Si è aggiunta la necessita di reperire ulteriori informazioni da un'altra tabella

    quindi, al tuo codice:
    SELECT acq.nominativo, ven.nominativo
    FROM compravendite c
    JOIN persone acq
    ON c.id1 = acq.id
    JOIN persone ven
    ON c.id2 = ven.id

    ho aggiunto agente.nominativo nella select e un'altra LEFT JOIN agenti ON c.id3 = agenti.id

    ottenendo, quindi:

    SELECT acq.nominativo, ven.nominativo,agente.nominativo
    FROM compravendite c
    JOIN persone acq
    ON c.id1 = acq.id
    JOIN persone ven
    ON c.id2 = ven.id
    LEFT JOIN agenti ON c.id3 = agenti.id

    A funzionare funziona... il problema è che ci mette circa 40 secondi! contro i 0.0002 senza quest'ultima join...
    E' vero che la tabella agenti contiene quasi 80.000 record... ma la query (alla quale ovviamente si aggiungono varie clausole WHERE) crea 50 risultati (a volte meno, a volte di piu... in ogni caso non da giustificare 40 secondi di query)

    Forse bisogna dirgli di fare PRIMA le due join e sul risultato eseguire la terza?

    Nel caso serva, spiego il senso della query:
    tabella compravendite dove sono presenti i campi IDvenditore, IDacquirente, IDagente

    l'IDvenditore c'è sempre, mentre gli altri due possono essere null
    se però c'è IDacquirente, ovviamente c'è anche IDagente e in questo caso la query mi deve ritrovare il nominativo dell'IDagente che sta nella tabella agenti

    quindi potrei avere un output del tipo:

    PINCO PALLINO | MARIO ROSSI | GERONIMO
    TIZIO | null | null


    EDIT: in realtà mi sono accorto che il discorso non è esattamente così come detto in precedenza, ovvero: nella tabella compravendite c'è un'ulteriore campo, NUMERO, che è sempre presente (univoco)... se IDacquirente è presente, allora NUMERO serve da id per trovare l'agente...
    quindi, ricapitolando, un possibile output è questo:

    120466 | PINCO PALLINO | MARIO ROSSI | GERONIMO
    120500 | TIZIO | null | null

    in effetti lo si puo considerare come IDagente... da far comparire sempre come ID e solo in presenza di una vendita come NOMINATIVO...

    Io mi sono perso, non so voi...

  7. #7
    Info aggiuntive:

    se invece di LEFT JOIN uso JOIN, la query viene eseguita istantaneamente ma perdo i casi NULL

    se levo il LEFT JOIN e nella select aggiungo un'ulteriore SELECT (per il aggiungere il campo nome agente), la query viene svolta in 11 secondi

    se invece levo il LEFT JOIN e nella select aggiungo un CASE WHEN THEN, mi abbasso a poco piu di 2 secondi...

    sempre comunque troppo per un esempio di query che restituisce 96 record...

    in realtà è indifferente: o 8000 record o 50, sempre 2 secondi e rotti ci impiega.. il collo di bottiglia è proprio quel campo in piu...

  8. #8
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da gasparirob
    Info aggiuntive:

    se invece di LEFT JOIN uso JOIN, la query viene eseguita istantaneamente ma perdo i casi NULL

    se levo il LEFT JOIN e nella select aggiungo un'ulteriore SELECT (per il aggiungere il campo nome agente), la query viene svolta in 11 secondi

    se invece levo il LEFT JOIN e nella select aggiungo un CASE WHEN THEN, mi abbasso a poco piu di 2 secondi...

    sempre comunque troppo per un esempio di query che restituisce 96 record...

    in realtà è indifferente: o 8000 record o 50, sempre 2 secondi e rotti ci impiega.. il collo di bottiglia è proprio quel campo in piu...
    Indicizza i campi del DB, ne guadagni in velocità di ricerca. Non esagerare altrimenti perdi in velocità nelle insert/update

  9. #9
    No, non ci credo!!! E' bastato indicizzare il campo agenti.id!! Adesso la query viene svolta in 0.00002 secondi

    Si, in effetti, nel caso reale il campo id della tabella agenti non esiste... esiste un corrispettivo campo che però non è un id... e quindi non è scontato darlo per indicizzato...

    Va beh.. comunque chiedo sempre conferma sulla bontà del codice... non tanto per ottenere prestazioni migliori, quanto per ottimizzare il modus operandi... per sapere se il ragionamento è giusto (mi riferisco ai vari JOIN...)

  10. #10
    Grazie Joe Taras, anche se l'ultimo messaggio l'ho letto dopo...
    ma hai confermato qual era il problema!!

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.