Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716

    mysql left join con valore NULL

    ciao ragazzi
    io ho 3 tabelle:

    tabellaObj:
    |id|titolo|descrizione|idListino|

    tabellaPrezzi:
    |id|idOggetto|quantita|prezzo|idListino|

    tabellaRange:
    id|quantita|idListino|

    praticamente ogni oggetto può avere infiniti range di prezzo...
    a me serve una query che restituisca il valore della quantita e del
    prezzo per ogni oggetto, cioè se ho

    tabellaObj:
    |1|oggetto1|blablabla|1|

    tabellaPrezzi:
    |1|1|50|10|1|
    |2|1|100|9|1|
    |3|1|150|8|1|

    tabellaRange:
    |1|50|1|
    |1|100|1|
    |1|150|1|

    dovrei riuscire ad estrapolare una roba del tipo
    tabellaRange.quantita | tabellaPrezzi.prezzo
    | 50 | 10 |
    | 100 | 9 |
    | 150 | 8 |

    ...e fin qui tutto bene. il problema si pone se si elimina una riga in
    tabellaPrezzi o se si aggiunge una riga nella tabellaRange dopo aver compilato tabellaPrezzi...
    se ad esempio elimino al 2° riga |2|1|100|9|1| il
    risutato della query deve essere

    | 50 | 10 |
    | 100 | NULL |
    | 150 | 8 |

    e invece no!

    ho provato con
    SELECT listinoRange.quantita, listinoPrezzi.prezzo
    FROM listinoRange
    LEFT JOIN listinoPrezzi ON ( listinoRange.value =
    listinoPrezzi.quantita )
    WHERE listinoRange.idListino = '1'
    ORDER BY listinoRange.quantita ASC

    e funziona ma solo se ho 1 solo oggetto nel db!
    se ne ho 2 mi duplica (giustamente) le righe, ho provato a inserire
    anche la clausola
    WHERE listinoRange.idListino = '1' && listinoPrezzi.idOggetto='1'

    e funziona a metà, cioè invece di darmi
    | 50 | 10 |
    | 100 | NULL |
    | 150 | 8 |
    come risultato mi dà
    | 50 | 10 |
    | 150 | 8 |

    però è fondamentale che per ogni riga della tabella Range mi
    restituisca una riga, se c'è corrispondenza con Prezzi bene, se no con
    valore Null.

    dove sbaglio?

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  2. #2
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    up

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  3. #3
    Originariamente inviato da thitan
    up
    la chiarezza non e' al massimo...

    presenti delle tabelle e poi usi nomi differenti negli esempi della query.

    un esempio di poca chiarezza potrebbe essere:

    .... ON ( listinoRange.value = listinoPrezzi.quantita )

    che senso ha? dovrebbe esserci una unione tramite un valore comune....

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

  4. #4
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    Originariamente inviato da piero.mac
    la chiarezza non e' al massimo...

    presenti delle tabelle e poi usi nomi differenti negli esempi della query.

    un esempio di poca chiarezza potrebbe essere:

    .... ON ( listinoRange.value = listinoPrezzi.quantita )

    che senso ha? dovrebbe esserci una unione tramite un valore comune....
    ok forse l'esempio del primo post l'ho scritto alla veloce...
    allora non consideriamo la tabella oggetti, teniamo conto solo delle 2, prezzi e range:

    tabellaRange:
    | id | value | idListino |
    | 1 | 50 | 1 |
    | 2 | 100 | 1 |
    | 3 | 150 | 1 |

    tabellaPrezzi:
    | id | idOggetto | idListino | quantita | prezzo |
    | 1 | 1 | 1 | 50 | 15 |
    | 2 | 1 | 1 | 100 | 13 |
    | 3 | 1 | 1 | 150 | 11 |

    questo è un esempio...ora la tabella Range è, diciamo, la madre, e ho bisogno che per ogni riga mi vada a cercare la corrispondenza tra Range.value e Prezzi.quantita.. con i dati sopra, la select mi deve restituire

    | 50 | 15 |
    |100 | 13 |
    |150 | 11 |

    se però l'utente dopo mi aggiunge un altro range senza aggiornarmi il prezzo, e mi ritrovo alla situazione

    tabellaRange:
    | id | value | idListino |
    | 1 | 50 | 1 |
    | 2 | 100 | 1 |
    | 3 | 150 | 1 |
    | 4 | 200 | 1 |


    la query mi deve restituire

    | 50 | 15 |
    | 100 | 13 |
    | 150 | 11 |
    | 200 | NULL |

    idem se invece viene eliminata una riga dalla tabella Prezzi:
    tabellaPrezzi:
    | id | idOggetto | idListino | quantita | prezzo |
    | 1 | 1 | 1 | 50 | 15 |
    | 3 | 1 | 1 | 150 | 11 |

    la query dovrà restituirmi
    | 50 | 15 |
    | 100 | NULL |
    | 150 | 11 |
    | 200 | NULL |

    spero si sia capito il problema, per ogni range mi deve dare una riga, con il range e, se c'è, il prezzo, altrimeni NULL.

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  5. #5
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    per ora ho ripiegato facendo 2 query distinte, una roba del tipo

    Codice PHP:
    [...]
    $idObj='3';
    $arrayRange=mysql_query("SELECT value FROM tabellaRange WHERE idListino='1' ORDER BY value ASC");

    while(list(
    $myRange)=mysql_fetch_array($arrayRange)){

     
    $arrayPrezzo=mysql_query("SELECT prezzo FROM tabellaPrezzi WHERE idListino='1' && quantita='$myRange' && idOggetto='$idObj'");
     if(
    mysql_num_rows($arrayPrezzo)==1){
      list(
    $myPrice)=mysql_fetch_array($arrayPrezzo);
     }else{
      
    $myPrice="-";
     }
     [...]

    ma non mi sembra una soluzione professionale

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  6. #6
    tabellaRange:
    | id | value | idListino |
    | 1 | 50 | 1 |
    | 2 | 100 | 1 |
    | 3 | 150 | 1 |

    tabellaPrezzi:
    | id | idOggetto | idListino | quantita | prezzo |
    | 1 | 1 | 1 | 50 | 15 |
    | 2 | 1 | 1 | 100 | 13 |
    | 3 | 1 | 1 | 150 | 11 |
    La query e' sulla via giusta ...

    dalla tabella Range devi estrarre "value" dove idListino = 1
    dalla tabella Prezzi devi estrarre "prezzo" dove quantita = Range.value (dei record trovati con Range.idListino = 1)

    codice:
    SELECT tabellaRange.value, tabellaPrezzi.prezzo
    FROM tabellaRange
    LEFT JOIN tabellaPrezzi ON ( tabellaRange.value = tabellaPrezzi.quantita )
    WHERE tabellaRange.idListino = '1'
    ORDER BY tabellaRange.quantita ASC
    non vedo perche' non debba funzionare. Ti rende tutti i record di tabellaRange che hanno idListino = 1, mentre se manca l'associazione richiesta in ON la tabellaPrezzi rende NULL.

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

  7. #7
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    Originariamente inviato da piero.mac
    La query e' sulla via giusta ...

    dalla tabella Range devi estrarre "value" dove idListino = 1
    dalla tabella Prezzi devi estrarre "prezzo" dove quantita = Range.value (dei record trovati con Range.idListino = 1)

    codice:
    SELECT tabellaRange.value, tabellaPrezzi.prezzo
    FROM tabellaRange
    LEFT JOIN tabellaPrezzi ON ( tabellaRange.value = tabellaPrezzi.quantita )
    WHERE tabellaRange.idListino = '1'
    ORDER BY tabellaRange.quantita ASC
    non vedo perche' non debba funzionare. Ti rende tutti i record di tabellaRange che hanno idListino = 1, mentre se manca l'associazione richiesta in ON la tabellaPrezzi rende NULL.
    si si così funziona, è come era all'inizio..
    solo che devo listare i prezzi per ogni oggetto:


    SELECT tabellaRange.value, tabellaPrezzi.prezzo
    FROM tabellaRange
    LEFT JOIN tabellaPrezzi ON ( tabellaRange.value = tabellaPrezzi.quantita )
    WHERE tabellaRange.idListino = '1' && tabellaPrezzi.idOggetto = '1'
    ORDER BY tabellaRange.value ASC

    non mi restituisce la riga NULL, me la omette proprio...

    tabellaRange:
    | id | value | idListino |
    | 1 | 50 | 1 |
    | 2 | 100 | 1 |
    | 3 | 150 | 1 |

    tabellaPrezzi:
    | id | idOggetto | idListino | quantita | prezzo |
    | 1 | 1 | 1 | 50 | 15 |
    | 3 | 1 | 1 | 150 | 11 |

    risultato:
    | 50 | 15 |
    | 150 | 11 |

    invece vorrei ottenere

    | 50 | 15 |
    | 100 | NULL |
    | 150 | 11 |

    secondo me è sbagliato quel ON ( tabellaRange.value = tabellaPrezzi.quantita )
    o meglio, devo trovare un modo diverso di farglielo macinare
    ora come ora è anche logico che non funzioni, ma non sò dove sbattere la testa...

    dovrei tradurre:
    prendi tabellaRange.value, tabellaPrezzi.prezzo per ogni riga di tabellaRange ma (se c'è una corrispondenza tabellaRange.value = tabellaPrezzi.quantita) prendi il prezzo da tabellaPrezzi, se no mettimi null, dove tabellaPrezzi.idListino = '1' && tabellaPrezzi.idOggetto = '1'

    in linguaggio mysql

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  8. #8
    mi spiace ma non capisco.

    il left join prende tutti i record della tabella descritta in from e invece nella tabella in JOIN solo quelli presenti, e per i record della tabella in from che non hanno una equi-join nella seconda tabella ci mette NULL.

    forse sbagli ad estrarre i dati, cioe' qualcosa ti esclude i record con NULL. Prova con phpmyadmin

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

  9. #9
    Utente di HTML.it L'avatar di thitan
    Registrato dal
    Feb 2001
    Messaggi
    716
    Originariamente inviato da piero.mac
    mi spiace ma non capisco.

    il left join prende tutti i record della tabella descritta in from e invece nella tabella in JOIN solo quelli presenti, e per i record della tabella in from che non hanno una equi-join nella seconda tabella ci mette NULL.

    forse sbagli ad estrarre i dati, cioe' qualcosa ti esclude i record con NULL. Prova con phpmyadmin
    ecco infatti secondo me è proprio quel 'ON ( tabellaRange.value = tabellaPrezzi.quantita )' che mi vincola la query, ma non sò che alternativa usare!

    bho ormai vado avanti col sistema a 2 query, però bisogna che ci salto fuori...
    ricapitolando, io nel db ho:

    tabellaRange:
    | id | value | idListino |
    | 1 | 50 | 1 |
    | 2 | 100 | 1 |
    | 3 | 150 | 1 |

    tabellaPrezzi:
    | id | idOggetto | idListino | quantita | prezzo |
    | 1 | 1 | 1 | 50 | 15 |
    | 3 | 1 | 1 | 150 | 11 |
    | 4 | 2 | 1 | 50 | 8 |
    | 5 | 2 | 1 | 100 | 7 |
    | 6 | 2 | 1 | 150 | 4 |

    se cerco i prezzi per l'oggetto con id 1, mi deve restituire
    | 50 | 15 |
    | 100 | NULL |
    | 150 | 11 |
    invece mi restituisce
    | 50 | 15 |
    | 150 | 11 |

    se invece cerco per idoggetto 2, deve darmi
    | 50 | 8 |
    | 100 | 7 |
    | 150 | 4 |

    e fin qui non si scappa

    www.inter-rail.it
    travellers, not tourist
    Is cuma cá mhinice a théann tú ar strae; is é is tábhachtaí gurb áil leat do bhealach a aimsiú arís.

  10. #10
    posta la query ... ma quella vera e non con campi/nomi fasulli. troppe volte l'errore era nella "traduzione" tra query reale e quella addomesticata per il pubblico.

    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.