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

    interrogazione piu tabelle dati diversi con inner JOIN

    eccomi
    sto cercando di imparare e con umiltà vi chiedo un grande aiuto.
    non vi spaventate per le brutture di codice sono alle prime armi...
    (abbiate pietà)

    ho creato un database mele
    con tre tabelle

    mele- cosi composto
    id
    datamele
    nomemele
    codmele
    totmele

    confmele- cosi composto

    idconf
    dataconf
    nomeconfmele
    codconfmele
    boxconfmele
    tottotconfmele

    fattmele cosi composto

    idfatt
    datafatt
    dittfattmele
    clifattmele
    nome1fattmele
    cod1fattmele
    tot1fattmele
    nome2fattmele
    cod2fattmele
    tot2fattmele
    eurofattmele

    ora ho creato l'inserimento dati la modifica etc... fino qui tutto bene
    adesso sono passato all'interrogazione dei dati...

    qui nonstante tutto... non riesco a venirne fuori, per ciò vi chiedo aiutoooooo

    ho una pagina con due frame .... una con un form che poi invia i dati dall'altra parte per l'interrogazione dei dati finchè faccio l'interrogazione
    una normale select tutto bene...

    //inverte la stringa data da inglese a americano per la visualizzazione
    function convertiData2($data){
    $rsl = explode ('-',$data);
    $rsl = array_reverse($rsl);
    return implode($rsl,'/');
    }



    //inverte la stringa data da italiano a inglese per la ricerca sul db
    function convertiData($data){
    $rsl = explode ('/',$data);
    $rsl = array_reverse($rsl);
    return implode($rsl,'-');
    }

    $datameleusDA=convertiData($datameleitaDA);

    $datameleusA=convertiData($datameleitaA);


    // funzione converte grammi in kg
    //function convertiGrammi($numero){
    //$numero = number_format($numero, 0,",",",");
    //return $numero ;

    //}

    // funzione converte grammi in kg CON DECIMALI
    function convertiGrammi($numero){
    $numero = $numero / 1000 ;
    $numero = number_format($numero, 3,",",",");
    return $numero ;

    }

    include("connmele.php");
    $nomemele = $_POST['nomemele'];
    $codmele = $_POST['codmele'];
    $datameleitaDA = $_POST['datameleitaDA'];
    $datameleitaA = $_POST['datameleitaA'];

    $query="SELECT * FROM mele WHERE nomemele LIKE ('".$nomemele."') AND codmele LIKE ('".$codmele."') AND datamele >= ('".$datameleusDA."') AND datamele <= ('".$datameleusA."') ORDER BY datamele,codmele ";
    $res = mysql_query($query);
    {
    }
    ?>
    <table id=stat align="center" width="85%" border="4" bordercolor="#CCCCCC" bgcolor="#FFFFFF" cellpadding="1" cellspacing="1" >

    <tr>


    <td width='5%' align='center'><a style='text-decoration:none' title='Data confezionatura'>DATA MELE </a></td>
    <td width='5%' align='center'><a style='text-decoration:none' title='codice'>CODICE</a></td>
    <td width='5%' align='center'><a style='text-decoration:none' title='Totale '>CARICO</a></td>
    </tr>
    <?php

    while($row=mysql_fetch_assoc($res)){


    //inverte la stringa data


    $row['datameleita']=convertiData2($row['datamele']);

    //converte i grammi del database in kg



    $row['totmelegrammi'] = $row['totmele'] ;
    $row['totmelekg']=convertiGrammi($row['totmelegrammi']);


    ?>
    <tr>


    <td width="5%" align="center"><?php echo $row['datameleita'] ?></td>
    <td width="5%" align="center"><?php echo $row['codmele'] ?></td>
    <td width="5%" align="center"><?php echo $row['totmele'] ?></td>


    </tr>



    <?php
    } //chiusura while
    ?>

    nella stessa pagina... (non riporto tutto il codice) interrogo, e visualizzo traquillamente anche i dati della tabella confmele e fattmele in ordine come
    mi pare e per le clausole scelte
    ora..
    vorrei fare in modo che fossero tutti insieme ordinati per data... ovviamente in base alla clausola WHERE...quindi stesso nome stesso codice e dalla data DA
    alla data A...
    ho provato con INNER JOIN... ma non sono riuscito

    ho provato anche in modo piu semplice cosi
    $query="SELECT mele.datamele , mele.codmele, mele.nomemele, mele.totmele,
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele,
    FROM mele INNER JOIN confmele ON
    mele.codmele = confmele.codconfmele ORDER BY 2 ";
    $res = mysql_query($query);
    ma neppure cosi visualizzo un tubo !!!

    potete aiutarmii per favore :-(

    ho cercato un bel po nel forum... ma forse colpa della mia ignoranza .. non sono riuscito
    a trovare qualcosa che mi aiutasse a capire bene....

    spero di essermi spiegato bene...grazie

  2. #2
    Ciao,
    potresti fornirci degli esempi di come sono valorizzate le tre tabelle?

    codice:
    id	datamele	nomemele	codmele	totmele
    1	25/01/2013	???		???	???
    codice:
    idconf	dataconf	nomeconfmele	codconfmele	boxconfmele	tottotconfmele
    1	25/01/2013	???		???		???		???
    codice:
    idfatt	datafatt	dittfattmele	clifattmele	nome1fattmele	cod1fattmele	tot1fattmele	nome2fattmele	cod2fattmele	tot2fattmele	eurofattmele
    1	25/01/2013	???		???		???		???		???		???		???		???		???
    dalla tua join si ipotizza che i valori di mele.codmele sia uguale a confmele.codconfmele, vero??

    Ciao
    Mik

  3. #3

    ops scusate ecco dei dati....

    Si certo scusate per se non sono stato preciso..

    Codice PHP:
    id    datamele             nomemele     codmele        totmele
     1    2013
    -01-26        ROSSA      RS13         10000
     2          2013
    -01-26        VERDE         VD13          20000


    idconf    dataconf           nomeconfmele         codconfmele     boxconfmele
    3             2013
    -01-26        ROSSA                RS13               cassetta
    4            2013
    -01-26         VERDE                VD13               cassetta



    idfatt    datafatt           dittfattmele    clifattmele nome1fattmele    cod1fattmele
    5             2013
    -01-27     ibosrl             cibosrl           ROSSA                  RS12    


    tot1fattmele nome2fattmele cod2fattmele tot2fattmele    eurofattmele
    5000                  VERDE             VD13           5000               25
    ,50 
    (scusate ma non riesco bene a mettere i dati in ordine... in visualizzazione spero si capisca)
    La selezione mi serve per vedere i dati da una dataDA a una dataA filtrando o solo per nome mele o per codice( il nome poi e per forza lo stesso) e visualizzare quindi tutti i "movimenti riferiti , su tutte le tre tabelle.
    ovviamente all'inizio avevo provato senza le variabili prese con il $_post per vedere in modo piu semplice se prendeva i dati...

    in effetti la pagina se faccio delle normali select me li prende e funziona...
    le variabili passano di la ma ho bisogno di aiuto credo per la relazione tra tabelle ...

    spero di aver dato sufficienti dati.... grazie ancora

  4. #4
    Ciao,
    partiamo dalla tua query di prova:

    codice:
    SELECT 
    mele.datamele , mele.codmele, mele.nomemele, mele.totmele, 
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele,
    FROM mele INNER JOIN confmele ON
    mele.codmele = confmele.codconfmele ORDER BY 2
    va bene l'impostazione per estrarre i dati dalle prime due tabelle... l'unica cosa credo che hai messo una virgola in più dopo confmele.tottotconfmele. La query esatta è:

    codice:
    SELECT 
    mele.datamele , mele.codmele, mele.nomemele, mele.totmele, 
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele
    FROM mele INNER JOIN confmele ON
    mele.codmele = confmele.codconfmele 
    ORDER BY 2
    inoltre, anzichè lanciare le query scrivendo
    codice:
    $res = mysql_query($query);
    utilizza il comando "die" per scropire qual è l'errore di sintassi.
    Qui trovi un esempio di utilizzo

    per quanto riguarda la terza tabella, la prima considerazione è che non è corretto utilizzare tante colonne, quanti sono gli articoli venduti (es: cod1fattmele, cod2fattmele, ecc ). La cosa corretta da fare è utilizzare un quarta tabella (tb_rec_fatt) così strutturata:
    codice:
    idfatt	idfatt_rec	codfattmele	totfattmele	nomefattmele
    5	1		RS12		5000		ROSSA
    5	2		VD13		5000		VERDE
    e lasciare nella tabella (fattmele) solo i dati di fatturazione
    codice:
    idfatt	datafatt	dittfattmele	clifattmele	eurofattmele
    5	27/01/2013	ibosrl		cibosrl		25,5
    In questo modo la query finale dovrebbe essere:
    codice:
    SELECT 
    mele.datamele , mele.codmele, mele.nomemele, mele.totmele, 
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele,
    tb_rec_fatt.idfatt_rec, tb_rec_fatt.totfattmele,
    fattmele.idfatt, fattmele.datafatt, fattmele.dittfattmele, fattmele.clifattmele, 
    fattmele.eurofattmele
    FROM mele, confmele, tb_rec_fatt, fattmele
    where mele.codmele = confmele.codconfmele 
    and mele.codmele = tb_rec_fatt.codfattmele
    and tb_rec_fatt.idfatt=fattmele.idfatt
    ORDER BY 2
    In alternativa se non vuoi cambiare le logiche delle tue tabelle, ahimè devi fare così:
    codice:
    SELECT * 
    FROM fattmele A, 
    (
    SELECT 
    mele.datamele , mele.codmele, mele.nomemele, mele.totmele, 
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele
    FROM mele INNER JOIN confmele ON
    mele.codmele = confmele.codconfmele 
    ) MELE1,
    (
    SELECT 
    mele.datamele , mele.codmele, mele.nomemele, mele.totmele, 
    confmele.dataconfmele, confmele.codconfmele, confmele.nomeconfmele, confmele.tottotconfmele
    FROM mele INNER JOIN confmele ON
    mele.codmele = confmele.codconfmele 
    ) MELE2
    WHERE A.cod1fattmele=MELE1.codmele
    AND A.cod2fattmele=MELE2.codmele
    Puoi notare che se eventualmente si aggiunge un terzo, quarto articolo nella fattura... devi cambiare la query di estrazione

    Spero di essere stato chiaro... altrimenti, chiedi pure

    Ciao
    Michele

  5. #5

    grazie e chiarimenti....

    Grazie mille per i chiarimenti....

    ho seguito subito i tuoi consigli e il die l'ho sta gia utilizzando ( OTTIMO !!!)
    per quanto riguarda il discorso fatturazione... ci vorrà un po di tempo... ma mi sono messo in discussione e cambierò sistema..... accogliendo il tuo suggerimento.. ma avrò bisogno di tempo...

    l'unica cosa che non mi torna è che i dati io li ricevo grazie a un form...
    tipo
    codice:
    $query="SELECT * FROM mele WHERE nomemele LIKE ('".$nomemele."') AND codmele LIKE ('".$codmele."') AND datamele >= ('".$datameleusDA."') AND datamele <= ('".$datameleusA."') ORDER BY datamele,codmele ";
    non ho capito dove inserire queste variabili all'interno della select con INNER...?????
    ovvero il cod LIKE il nome LIKE e dalla datamele $datameleDA a datamele $datameleA ...
    .. nel dubbio chiedo...la select poi che mi hai girato l'ho modificata mettendoin fondo nel WHERE OR al posto di AND perchè non tutte e due le variabili devono essere vere per visualizzare i dati... basta una, il ragionamento è del tipo seleziona tutte le mele raccolte (mele)
    tutte le confezionate (confmele) tutte fatture dove sono state vendute (fattmele)
    da una data a una data che hanno o il codmele = a o il nomemele = a... ovviamente questo lo decide il form....


    poi non so se questa è una domanda da farti... se sono nella sezione giusta..ma il risultato c'è eccome ma me li ripete ... ovvero siccome ci sono due confezionature ad ogni confezione corrisponde sempre una melatura (raccolta) e fatturazione.. non so se mi sono spiegato (quanta pazienza devi avere michele..)
    ho paura che dipenda da php...


    grazie ancora....
    PS: quel die e fantastico grazie

  6. #6

    michele dammi una dritta

    naturalmente continuo a lavorarci...

    memore dei tuoi consigli e consapevole che le cose andranno cambiate... mi sono un po mastu...il cervello e facendo delle prove sono arrivato a ...
    una select che funziona... o provato sulle due tabelle mele e confmele... del tipo
    $query="SELECT mele.* , confmele.* FROM mele, confmele WHERE
    datamele >= ('".$datameleusDA."') AND datamele <= ('".$datameleusA."') AND dataconfmele >= ('".$datameleusDA."') AND dataconfmele <= ('".$datameleusA."')AND codmele LIKE ('".$codmele."') AND nomemele LIKE ('".$nomemele."') AND codconfmele LIKE ('".$codmele."') AND nomeconfmele LIKE ('".$nomemele."') ORDER BY 2 ";
    $res = mysql_query($query) or die ('Error updating database: ' . mysql_error());

    {





    }
    while($row=mysql_fetch_assoc($res)){

    e funziona... unico difetto è che mi ripete le righe !!!!
    o meglio avendo due confezionature mi ripete su ogni confezionatura sempre la raccolta...dato della tabella mele
    se mi puoi aiutare a capire questo..


    ma poi ecco la dritta che ti chiedo... visto che devo mettere le mani alla struttura del db e visto che è un lavoro brigoso vorrei non fare piu errori di logica... ti chiedo:
    a questo punto no mi conviene chiamare in ogni tabella tutti campi data in data e non datamele per la tabella mele e dataconfmele per la tabella confmele ?
    e fare lo stesso ragionamento per tutti i campi...
    ovvero tutte le tabelle avranno i campi con gli stessi nomi
    codmele
    nomemele
    data ???

    oltre che fare quella scissione delle tabella fattmele ?
    cosi da avere anche nella tabella prodotti codmele nomemele data
    e alla fine quando ricerco non se i campi sono uguali riesco meglio a estrapolare o comunque a lavorare sui dati ??
    grazie

  7. #7

    Re: michele dammi una dritta

    Originariamente inviato da gippo2013
    naturalmente continuo a lavorarci...

    memore dei tuoi consigli e consapevole che le cose andranno cambiate... mi sono un po mastu...il cervello e facendo delle prove sono arrivato a ...
    una select che funziona... o provato sulle due tabelle mele e confmele... del tipo
    $query="SELECT mele.* , confmele.* FROM mele, confmele WHERE
    datamele >= ('".$datameleusDA."') AND datamele <= ('".$datameleusA."') AND dataconfmele >= ('".$datameleusDA."') AND dataconfmele <= ('".$datameleusA."')AND codmele LIKE ('".$codmele."') AND nomemele LIKE ('".$nomemele."') AND codconfmele LIKE ('".$codmele."') AND nomeconfmele LIKE ('".$nomemele."') ORDER BY 2 ";
    $res = mysql_query($query) or die ('Error updating database: ' . mysql_error());

    {





    }
    while($row=mysql_fetch_assoc($res)){

    e funziona... unico difetto è che mi ripete le righe !!!!
    o meglio avendo due confezionature mi ripete su ogni confezionatura sempre la raccolta...dato della tabella mele
    se mi puoi aiutare a capire questo..
    questa la modificherei così:
    codice:
    SELECT mele.* , confmele.*
    FROM mele A, confmele B
    WHERE DATAMELE BETWEEN  ('".$datameleusDA."') AND ('".$datameleusA."')
    AND DATACONFMELE BETWEEN  ('".$datameleusDA."') AND ('".$datameleusA."')
    AND A.CODMELE=B.codconfmele
    AND (codmele LIKE ('".$codmele."') OR nomemele LIKE ('".$nomemele."'))
     ORDER BY 2
    ma poi ecco la dritta che ti chiedo... visto che devo mettere le mani alla struttura del db e visto che è un lavoro brigoso vorrei non fare piu errori di logica... ti chiedo:
    a questo punto no mi conviene chiamare in ogni tabella tutti campi data in data e non datamele per la tabella mele e dataconfmele per la tabella confmele ?
    e fare lo stesso ragionamento per tutti i campi...
    ovvero tutte le tabelle avranno i campi con gli stessi nomi
    codmele
    nomemele
    data ???

    oltre che fare quella scissione delle tabella fattmele ?
    cosi da avere anche nella tabella prodotti codmele nomemele data
    e alla fine quando ricerco non se i campi sono uguali riesco meglio a estrapolare o comunque a lavorare sui dati ??
    grazie
    su questa parte devi tener conto:
    le tabelle dei fatti
    - nel tuo caso è la tabella fattmele
    - contengono le misure, ossia valori numerici come qta, euro, costi, vendite + gli id dei records presenti sulle tabelle dimensioni
    - es:
    TB_VENDITE
    codice:
    ID_FATT	ID_PROD	ID_CLIE	QTA	PREZZO	COSTO
    1	101	201	44	3,5	154
    2	102	202	45	1,5	67,5
    le tabelle dimensioni:
    - nel tuo caso è mele
    - contengono le anagrafiche dei prodotti, clienti, gruppi, ecc

    TB_PRODOTTI
    codice:
    ID_PROD	COD_PRD	NOME_PRD	ATTR_1	ATTR_2
    101	MELA_A	MELA VERDE	…	…
    102	MELA_B	MELA ROSSA	…	…
    TB_CLIENTI
    codice:
    ID_CLI	COD_CLI	NOME_CLI	REF_CLI	ATTR_1
    201	CAR_1	CARREF…		PIPPO	…
    202	ESS_1	ESSELUN..	PLUTO	…
    quindi:
    - le informazioni non devono essere ridondanti
    - nelle tabelle dei fatti metti solo misure e id
    - le informazioni-attributi relative alle mele, mettile tutte nella tabella mele
    - per darti indicazioni sulle date, mi dovresti dire che significato hanno quei campi data
    - utilizza per i nomi delle tabelle un prefisso (es: TB_MELE, TB_FATT_MELE)
    - codmele e nomemele sono attributi delle mele e quindi utilizza questi campi solo sulla tabella tb_mele

    .......comincia da queste info....

    Ciao
    Michele

  8. #8

    indicazioni tb

    grazie per i suggerimenti...
    unica cosa che tu mi suggerisci

    ....codmele e nomemele sono attributi delle mele e quindi utilizza questi campi solo sulla tabella tb_mele
    ma se devo mettere in una cassetta.. le mele ... anche in confmele devo avere un riferimento, altrimenti come faccio a sapere cosa c'è dentro ? e il cod e nome sono due cose diverse il cod è un numero univoco vla2013 che identifica quella raccolta ... il nome invece può essere uguale ad altre raccolte che hanno lo stesso tipo di mela... ma sono state raccolte in posti diversi e in anni diversi....non so se mi spiego..

    un'ultima cosa....

    il tuo suggerimento in questa la modificherei così:... non va mi da....
    Unknown table 'mele'
    funziona solo
    SELECT DISTINCT mele.* , confmele.* FROM mele , confmele WHERE
    datamele BETWEEN ('".$datameleusDA."') AND ('".$datameleusA."') AND dataconfmele BETWEEN ('".$datameleusDA."') AND ('".$datameleusA."')
    AND codmele LIKE ('".$codmele."') AND nomemele LIKE ('".$nomemele."') AND codconfmele LIKE ('".$codmele."') AND nomeconfmele LIKE ('".$nomemele."') ORDER BY 2 "

    inoltre vorrei capire perche.. forse ti era sfuggita la mia domanda(con tutte quelle che faccio :-(

    anche se funziona fatta alla mia maniera... unico GRANDE difetto è che mi ripete le righe !!!!
    c'è modo di eliminare gli id doppi sia di idmele che idconfmele ?

    grazie

  9. #9

    Re: indicazioni tb

    Originariamente inviato da gippo2013
    grazie per i suggerimenti...
    unica cosa che tu mi suggerisci

    ....codmele e nomemele sono attributi delle mele e quindi utilizza questi campi solo sulla tabella tb_mele
    ma se devo mettere in una cassetta.. le mele ... anche in confmele devo avere un riferimento, altrimenti come faccio a sapere cosa c'è dentro ? e il cod e nome sono due cose diverse il cod è un numero univoco vla2013 che identifica quella raccolta ... il nome invece può essere uguale ad altre raccolte che hanno lo stesso tipo di mela... ma sono state raccolte in posti diversi e in anni diversi....non so se mi spiego..
    per quanto riguarda le confezioni, secondo me è un altra tabella "DIMENSIONE" come per la tabella mele, quindi
    ID_CONF, TIPO_CONF, NOME_CONF, DIMENSIONI_CONF, PORTATA_KG, ECC...

    poi su una tabella contenente le vendite avrai
    ID_VENDITA, ID_CONF, ID_PROD, QTA, ECC....

    io ho questa idea, magari nella pratica è diverso il concetto... non me ne intendo di mele...

    un'ultima cosa....

    il tuo suggerimento in questa la modificherei così:... non va mi da....
    Unknown table 'mele'
    funziona solo
    SELECT DISTINCT mele.* , confmele.* FROM mele , confmele WHERE
    datamele BETWEEN ('".$datameleusDA."') AND ('".$datameleusA."') AND dataconfmele BETWEEN ('".$datameleusDA."') AND ('".$datameleusA."')
    AND codmele LIKE ('".$codmele."') AND nomemele LIKE ('".$nomemele."') AND codconfmele LIKE ('".$codmele."') AND nomeconfmele LIKE ('".$nomemele."') ORDER BY 2 "

    inoltre vorrei capire perche.. forse ti era sfuggita la mia domanda(con tutte quelle che faccio :-(

    anche se funziona fatta alla mia maniera... unico GRANDE difetto è che mi ripete le righe !!!!
    c'è modo di eliminare gli id doppi sia di idmele che idconfmele ?

    grazie
    ho risposto al problema delle righe duplicate fornendoti la query corretta... mancano le join che lega le due tabelle

    dovresti, credo, seguire le indicazioni che ti ho dato per non avere dati ridondanti sulle varie tabelle

    Ciao
    Mik

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 © 2026 vBulletin Solutions, Inc. All rights reserved.