Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Join tabelle...

  1. #1
    Utente di HTML.it L'avatar di bobonzo
    Registrato dal
    Jul 2000
    Messaggi
    495

    Join tabelle...

    salve a tutti..mi avventuro nel join tra tabelle.

    il mio intento è di recuperare dati da 3 tabelle (ordini, causali, clienti)
    in poche parole in ordini ho l'id cliente e l'id causale...e mostrando i record contenuti in ordini vorrei visualizzare non l'id ma il nome del cliente e della causale.

    SELECT id_ordine, data_ordine, tipo, nome_causale, nome, cognome, societa
    FROM ordini, causali, clienti
    WHERE causali.id_causale = causale AND clienti.id_cliente = nome_cliente
    ORDER BY id_ordine DESC

    non so perchè ma escono 2 record su 3 che dovrebbero essere
    sbaglio di certo quel maledetto AND?

    P.S. il nome della causale e del cliente però vengono recuperati correttamente

    help



    grazie

  2. #2

    Re: Join tabelle...

    Originariamente inviato da bobonzo
    salve a tutti..mi avventuro nel join tra tabelle.

    il mio intento è di recuperare dati da 3 tabelle (ordini, causali, clienti)
    in poche parole in ordini ho l'id cliente e l'id causale...e mostrando i record contenuti in ordini vorrei visualizzare non l'id ma il nome del cliente e della causale.

    SELECT id_ordine, data_ordine, tipo, nome_causale, nome, cognome, societa
    FROM ordini, causali, clienti
    WHERE causali.id_causale = causale AND clienti.id_cliente = nome_cliente
    ORDER BY id_ordine DESC

    non so perchè ma escono 2 record su 3 che dovrebbero essere
    sbaglio di certo quel maledetto AND?

    P.S. il nome della causale e del cliente però vengono recuperati correttamente

    help



    grazie
    allora, se ho capito bene, hai:

    ordini(id, idCliente, id_causale, etc...)
    causali(id, nome, etc..)
    clienti(id, nome, etc...)

    ti conviene fare uso dell'inner join:

    Codice PHP:
    SELECT clienti.nome AS nomeClientecausali.nome AS nomeCausale
    FROM 
    ((ordini INNER JOIN clienti ON ordini.idCliente=clienti.id)
               
    INNER JOIN causali ON ordini.idCausale=causali.id
    così il codice è più pulito e anche più efficiente

  3. #3
    Utente di HTML.it L'avatar di zoseppe
    Registrato dal
    Jan 2005
    Messaggi
    306
    Puoi provare anche questa, dovrebbe andare...
    Codice PHP:
    SELECT CONCAT(c.nome,' - ',c.cognome,' - 'c.societa) as clientenome_causale as causale
    FROM ordini 
    AS a
    JOIN causali 
    AS b ON  a.id_causale b.causale
    JOIN clienti 
    AS c ON  a.id_cliente c.idcliente

    ORDER BY id_ordine DESC 
    Fammi sapere se funziona

  4. #4
    Utente di HTML.it L'avatar di bobonzo
    Registrato dal
    Jul 2000
    Messaggi
    495
    salve...
    grazie ragazzi ma non va.
    ho provato quello di ciccio ma escono comunque 2 record su 3

    il problema sembra essere quello della gestione di mancate corrispondenze.

    cioè al momento l'id_cliente di uno dei record in ordini non esiste nella tabella clienti perchè è stato cancellato.

    ...dunque non mi visualizza il record...ma è una cosa che servirebbe.

    come faccio?

  5. #5
    Originariamente inviato da bobonzo
    salve...
    grazie ragazzi ma non va.
    ho provato quello di ciccio ma escono comunque 2 record su 3

    il problema sembra essere quello della gestione di mancate corrispondenze.

    cioè al momento l'id_cliente di uno dei record in ordini non esiste nella tabella clienti perchè è stato cancellato.

    ...dunque non mi visualizza il record...ma è una cosa che servirebbe.

    come faccio?
    questo non l'avevi detto!
    Infatti l'inner join lo si usa quando sicuramente ci sono corrispondenze (come è in generale)
    Puoi optare per il left join:

    Codice PHP:
    SELECT clienti.nome AS nomeClientecausali.nome AS nomeCausale 
    FROM 
    ((ordini LEFT JOIN clienti ON ordini.idCliente=clienti.id
               
    LEFT JOIN causali ON ordini.idCausale=causali.id
    In questo modo vengono presi tutti gli ordini.

    p.s. se provavi il codice di zoseppe, dove c'è solo il join, mi sa ke funzionava direttamente!
    Però in generale cerco di evitarlo x motivi di efficienza e controllo

  6. #6
    Utente di HTML.it L'avatar di zoseppe
    Registrato dal
    Jan 2005
    Messaggi
    306
    Concordo pienamente, ma attenzione: se è stato cancellato un record nulla può nemmeno un left join! Se il dato è mancante mica lo può inventare!

  7. #7
    Utente di HTML.it L'avatar di bobonzo
    Registrato dal
    Jul 2000
    Messaggi
    495
    funziona perfettamente...
    sì sì è chiaro che se non trova corrispondenze il campo sarà vuoto e dunque non visualizzerà nulla.

    domandina vista la gentilezza.
    avendo questa query

    $query_fatture = "
    SELECT id_ordine, data_ordine, clienti.nome AS nomeCliente, clienti.cognome AS cognomeCliente, clienti.societa AS societaCliente, causali.nome_causale AS nomeCausale
    FROM ((ordini LEFT JOIN clienti ON ordini.nome_cliente=clienti.id_cliente)
    LEFT JOIN causali ON ordini.causale=causali.id_causale)
    WHERE YEAR(data_ordine)=$anno
    ORDER BY id_ordine DESC
    ";

    vorrei inserire nella pagina un campo attraverso il quale è possibile inserire il numero della fattura...e dunque visualizzare solo la fattura con id = campo

    dovrei dunque aggiungere al WHERE un
    AND id_ordine = $nomecampo
    ma solo nel caso in cui il campo sia diverso da null chiaramente perchè se è null vuol dire che la ricerca non è stata fatta

    grazie infinite

  8. #8
    Utente di HTML.it L'avatar di bobonzo
    Registrato dal
    Jul 2000
    Messaggi
    495
    ho fatto così

    if (isset($_POST['chiave'])) {
    $chiave = $_POST['chiave'];
    if ($chiave != '') {
    $where = "AND id_ordine = '$chiave'";
    }
    }
    else {
    $where = '';
    }

    e poi ho aggiunto alla query $where
    forse una schifezza ma funge

  9. #9
    Originariamente inviato da bobonzo
    ho fatto così

    if (isset($_POST['chiave'])) {
    $chiave = $_POST['chiave'];
    if ($chiave != '') {
    $where = "AND id_ordine = '$chiave'";
    }
    }
    else {
    $where = '';
    }

    e poi ho aggiunto alla query $where
    forse una schifezza ma funge
    viva l'eleganza!
    Codice PHP:
    [I]$query_fatture "
    SELECT id_ordine, data_ordine, clienti.nome AS nomeCliente, clienti.cognome AS cognomeCliente, clienti.societa AS societaCliente, causali.nome_causale AS nomeCausale
    FROM ((ordini LEFT JOIN clienti ON ordini.nome_cliente=clienti.id_cliente)
    LEFT JOIN causali ON ordini.causale=causali.id_causale)
    WHERE YEAR(data_ordine)=
    $anno
    ORDER BY id_ordine DESC
    "
    ;[/I]


    $chiave = (isset($_POST['chiave']) ? $_POST['chiave'] : "");
    $query .= ( ($chiave!="") ? " AND id_ordine = '$chiave'" "" ); 

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.