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

    Funzionamento di JOIN per leggere due tabelle

    Ciao,
    dopo riceche sul forum e dopo aver capito a grandi linee come funzionano le normali query con il JOIN sono ad un punto morto.

    Ho due tabelle "offerte" e "periodi" collegate tra loro da un campo "idofferta".
    Nella tabella "offerte" esisterà sempre un unico record per ogni valore "idofferta" mentre diversi nella tabella "periodi".
    Nella tabella "periodi" c'è un campo "prezzo".
    Il rusiltato che cerco è:
    estrarre un solo record dalla tabella "offerte" dopo aver ordinato per "prezzo" dalla tabella "periodi".

    Faccio un esempio così mi spiego meglio.

    Tabella "offerte"
    idofferta->80
    idofferta->81
    idofferta->82

    Tabella "periodi"
    idofferta->80 prezzo->75
    idofferta->80 prezzo->33
    idofferta->81 prezzo->60
    idofferta->82 prezzo->11
    idofferta->82 prezzo->105
    idofferta->82 prezzo->53

    io vorrei che mi estraesse un solo record della tabella "offerte" però ordinato in base al prezzo minore di "periodi".
    In poche parole il risultato dovrebbe essere:

    Codice offerta: 82 (perchè il prezzo minore è 11)
    Codice offerta: 80 (perchè il prezzo minore è 33)
    Codice offerta: 81 (perchè il prezzo minore è 60)

    ho fatto questo codice ma mi ripete i record di "offerte"


    $laquery = "select idofferta from `offerte` as tabofferte, `periodi` as tabperiodi where tabperiodi.idofferta = tabofferte.idofferta order by tabperiodi.prezzogiornaliero ASC";


    Spero di essermi spiegato bene.....

    Garzie in anticipo
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

  2. #2
    Utente di HTML.it L'avatar di Akito
    Registrato dal
    Nov 2005
    Messaggi
    101
    Ciao,
    solo con la JOIN non si può fare, devi usare anche la clausola GROUP BY.
    Prova così:

    $laquery = "SELECT idofferta FROM `offerte` as tabofferte, `periodi` as tabperiodi WHERE tabperiodi.idofferta = tabofferte.idofferta AND tabperiodi.prezzogiornaliero IN (SELECT MIN(prezzo) FROM periodi GROUP BY prezzogiornaliero)";

    non ricordo se IN è IN o INTO, comunque ti ho dato l'idea.

    Credo che tu possa fare anche così, se non ti servono altri campi di offerte:
    SELECT idofferta, MIN(prezzo) FROM periodi GROUP BY prezzogiornaliero

    qui trovi alcuni esempi: http://www.risorse.net/mysql/funzioni_aggregate.asp

    Ciao
    Akito
    W l'open source!!

  3. #3
    Akito Ciao,
    grazie per la risposta.

    Ho provato ad eseguire la query ma non mi visualizza niente.
    Ti posto il codice intero (anche per la rilettura dei dati).


    $laquery = "SELECT * FROM `offerte` as tabofferte,
    `periodi` as tabperiodi WHERE tabperiodi.idofferta = tabofferte.idofferta
    AND tabperiodi.prezzogiornaliero IN (SELECT MIN(prezzogiornaliero) FROM periodi GROUP BY prezzogiornaliero)";
    $res_count = mysql_query("$laquery");
    if ($res_count > 0)
    {
    $tot_records = $res_count[0];
    $query_limit = mysql_query("$laquery LIMIT 1, 6");
    while($results = mysql_fetch_array($query_limit))
    {
    $id_v = $results['idofferta'];
    echo "$id_v
    ";
    }
    }


    Mi perdo da qlc parte...
    Grazie ancora
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

  4. #4
    Ho utilizzato il codice

    SELECT * FROM offerte as tabofferte INNER JOIN periodi as tabperiodi ON tabofferte.idofferta = tabperiodi.idofferta order by tabperiodi.prezzogiornaliero


    Funziona benissimo è solo che mi viene visualizzato un record fi tabella 1 per ogni record di tabella2.

    In poche parole succede

    Offerta2-->periodo2 al prezzo di 150
    Offerta2-->periodo5 al prezzo di 250
    Offerta3-->periodo3 al prezzo di 312
    Offerta2-->periodo1 al prezzo di 753
    Offerta1-->periodo4 al prezzo di 1000

    invece io voglio che mi estragga un solo valore di offerta in base al prezzo minore su periodi, e quindi:

    Offerta2-->periodo2 al prezzo di 150
    Offerta3-->periodo3 al prezzo di 312
    Offerta1-->periodo4 al prezzo di 1000

    Dovrebbe mancare solo un parametro ma non riesco a capire quale.. :berto: :berto:

    Grazie di nuovo.
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    591
    prova con:
    SELECT min(tabperiodi.prezzogiornaliero),tabofferte.campi .....,tabperiodi.campi....
    FROM offerte as tabofferte INNER JOIN periodi as tabperiodi ON tabofferte.idofferta = tabperiodi.idofferta
    group by tabofferte.campi.....,tabperiodi.campi.... (stessi campi di sopra)
    order by 1

  6. #6
    Utente di HTML.it L'avatar di Akito
    Registrato dal
    Nov 2005
    Messaggi
    101
    Ciao,
    scusa se ti rispondo solo ora ma ieri ho avuto un lavoro urgente e non ho potuto seguire il forum.
    Avevo commesso un piccolo errore, ora ho avuto il tempo di testare il codice seguente e ti assicuro che sotto mysql funziona.
    Ora ti spiego passo per passo questo codice sql:

    Codice PHP:
    create table offerte (
      
    id_offerte INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      
    off VARCHAR(255)
    );

    INSERT INTO offerte (offVALUES ('a');
    INSERT INTO offerte (offVALUES ('b');
    INSERT INTO offerte (offVALUES ('c');

    create table periodi (
      
    id_periodi INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      
    id_offerte INT NOT NULL,
      
    per INT NOT NULL
    );

    INSERT INTO periodi (id_offerteperVALUES (1100);
    INSERT INTO periodi (id_offerteperVALUES (250);
    INSERT INTO periodi (id_offerteperVALUES (280);
    INSERT INTO periodi (id_offerteperVALUES (3150);
    INSERT INTO periodi (id_offerteperVALUES (3120); 
    Mi sono creato due tabelle simili a quelle che usi tu e le ho riempite con alcuni dati


    Codice PHP:
    SELECT MIN(perFROM periodi GROUP BY id_offerte 
    Questa query ti restituisce tutti i valori minimi del campo "per" della tabella "periodi" raggruppandoli secondo il campo "id_offerte". Mi spiego meglio, Il GROUP BY si occupa di suddividere la tabella "periodi" in 3 gruppi (un gruppo contiene i periodi con id_offerte=1, un gruppo contiene i periodi con id_offerte=2, e... cosi via ) mentre il MIN(per) prende, da ogni gruppo creato con GROUP BY, il valore di "per" più piccolo.


    Codice PHP:
    SELECT o.off AS nomeoffertaMIN(p.per) AS minperiodo FROM periodi pofferte o WHERE o.id_offerte=p.id_offerte GROUP BY p.id_offerte
    Questa query invece è una elaborazione di quella superiore, il principio di base è lo stesso ma è stato inserito il nome delle offerte.
    "p" e "o" sono dei nomi che vengono usati internamente alla query per identificare univocamente i campi che hanno lo stesso nome (nell'esempio il campo id_offerte si chiama nello stesso modo in entrambe le tabelle).
    "nomeofferta" e "minperiodo" sono invece dei nomi arbitrari che si assegnano per essere usati poi nel codice PHP.


    Il codice PHP per visualizzare tale query può essere il seguente:
    Codice PHP:
    $sql "SELECT o.off AS nomeofferta, MIN(p.per) AS minperiodo FROM periodi p, offerte o WHERE o.id_offerte=p.id_offerte GROUP BY p.id_offerte";
    $res mysql_query($sql);
    if(
    $res) {
      if(
    mysql_num_row($res)>0) {
        while(
    $riga=mysql_fetch_array($res)) {
          echo 
    $riga["nomeofferta"]." ".$riga["minperiodo"]."</br>\n";
        }
      }

    E' tutto
    Spero di aver chiarito i tuoi dubbi.

    Ciao
    Akito
    W l'open source!!

  7. #7
    Garzie a tutti per le risposte. Con il vostro aiuto ho iniziato a capirci un po'.

    AKI ho provato il tuo codice e mi dava errore (penso perchè mancava una s al mysql_num_row che doveva essere mysql_num_rows).

    Poi ho modificato l'errorino e il risultato mi viene visualizzato però non correttamente.

    Ho riadattato il tuo codice al mio script

    $selezione = "";

    $sqlquerycount = "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p,
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    ";
    $sqlquery = "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p,
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    ";


    $selezione = str_replace("\\", "", $selezione);
    $count = mysql_db_query("$nome_database", "
    $sqlquerycount");




    $res_count = mysql_num_rows($count);
    // numero totale di records
    $tot_records = $res_count;

    // risultati per pagina(secondo parametro di LIMIT)
    $per_page = 4;

    // numero totale di pagine
    $tot_pages = ceil($tot_records / $per_page);
    if (!isset($_GET['page'])){$_GET['page'] = 0;}
    // pagina corrente
    $current_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];

    // primo parametro di LIMIT
    $primo = ($current_page - 1) * $per_page;

    // esecuzione seconda query con LIMIT
    $query_limit = mysql_query("
    $sqlquery
    LIMIT $primo, $per_page");



    $attuale = "";
    $precedente = "";

    while($results = mysql_fetch_array($query_limit))
    {
    $idofferta_v = $results['nomeofferta'];
    $prezzo_v = $results['minperiodo'];
    echo " - Id offerta $idofferta_v - Prezzo $prezzo_v
    ";
    }

    // ------------- CREAZIONE DEL MENU PAGINE --------------------------------------
    $paginazione = "";
    if ($tot_pages > 1)
    {
    for($i = 1; $i <= $tot_pages; $i++)
    {
    if($i == $current_page)
    {
    $paginazione .= "| <font color=\"#ffffff\">$i</font>" . " ";
    }
    else
    {
    $paginazione .= "| <a href=\"?page=$i&selezione=$selezione\" title=\"Vai alla pagina $i\"><u><font color=\"#F1F406\">$i</font></u></a>";
    }
    }
    }
    echo $paginazione;




    In poche parole la tabella "periodi" è popolata da questi record

    idperiodo-->1/idofferta-->9/prezzogiornaliero-->22
    idperiodo-->2/idofferta-->9/prezzogiornaliero-->189
    idperiodo-->3/idofferta-->10/prezzogiornaliero-->30
    idperiodo-->5/idofferta-->12/prezzogiornaliero-->80
    idperiodo-->6/idofferta-->12/prezzogiornaliero-->36
    idperiodo-->7/idofferta-->13/prezzogiornaliero-->375


    Naturalmente sulla tabella "offerte" ci sono i record con campi "idofferta" 9, 10, 12, 13 (un record per ogni codice offerta).

    Il risultato visualizzato è però

    - Id offerta 9 - Prezzo 22
    - Id offerta 12 - Prezzo 36



    Due giorni che ci divento matto per fare una paginazione di record... :berto: :berto:

    Mi sembra sempre di esserci arrivato e puoi mi perdo...

    Sono disposto ad acquistare casa per chi mi dà na dritta
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

  8. #8
    Utente di HTML.it L'avatar di Akito
    Registrato dal
    Nov 2005
    Messaggi
    101
    Devi sostituire queste righe:

    Codice PHP:
    $sqlquerycount "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    "
    ;
    $sqlquery "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    "

    con queste righe:

    Codice PHP:
    $sqlquerycount "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.idofferta order by p.prezzogiornaliero ASC
    "
    ;
    $sqlquery "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.idofferta order by p.prezzogiornaliero ASC
    "

    e vedrai che la select ti restituisce i dati correti.
    W l'open source!!

  9. #9
    Originariamente inviato da Akito
    Devi sostituire queste righe:

    Codice PHP:
    $sqlquerycount "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    "
    ;
    $sqlquery "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.prezzogiornaliero order by p.prezzogiornaliero ASC
    "

    con queste righe:

    Codice PHP:
    $sqlquerycount "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.idofferta order by p.prezzogiornaliero ASC
    "
    ;
    $sqlquery "
    SELECT o.idofferta AS nomeofferta, MIN(p.prezzogiornaliero) AS minperiodo FROM periodi p, 
    offerte o WHERE o.idofferta=p.idofferta GROUP BY p.idofferta order by p.prezzogiornaliero ASC
    "

    e vedrai che la select ti restituisce i dati correti.
    La mia spada è al servizio del tuo arco.

    Grazie mille per la pazienza e la disponibilità. Sei un grande.
    A buon rendere davvero
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

  10. #10
    Rieccomi,
    succede una cosa alquanto strana...
    visualizzo i risultati nella pagina e, come detto, mi mostra tutto perfettamente.

    Però se modifico un record (o di offerte o di periodi) mi esclude il record modificato.
    Non me lo mostra (in modo permanente, cioè anche se riavvio il browser) anche se modifico dei campi che non prelevo con la query.

    Sembra strano ma vero

    Da cosa può dipendere?

    Grazie di nuovo
    Dalla vita altrui attingeva la sua oscura magia...
    Membro del Sacro Ordine degli elfi oscuri di Kand

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.