Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di bANART
    Registrato dal
    Jul 2005
    Messaggi
    662

    Query join con risultati doppi. Dove sbaglio?

    Ciao, so che è sabato pomeriggio e invece di andarmi a fare una bella partita a calcetto sto quì a scassarvi, ma ho un problema.

    Che per caso a qualcuno di voi è già capitato di fare una query con JOIN e trovarsi i risultati raddoppiati?

    ho questa select:
    SELECT * FROM categories INNER JOIN a_data ON categories.brand='1'

    ..ma mi ripete i risultati..

    Questo è il codice:
    Codice PHP:
        $sql "SELECT * FROM categories INNER JOIN a_data ON categories.brand='1'";
    $res mysql_query($sql,$connect);

    $numrow mysql_num_rows($res); 

    echo 
    $sql."
    "
    ;
    echo 
    $numrow."

    "
    ;

    if(
    $numrow 0){
        while (
    $row mysql_fetch_array($res))
            {
                echo 
    $row['id_user']."
    "
    ;
            }
        }else{
            echo 
    "nessun risultato trovato";
        } 
    I risultati dovrebbero essere 12 ma invece mi compare questo:

    SELECT DISTINCT * FROM categories INNER JOIN a_data ON categories.brand='1'
    24

    143
    143
    147
    147
    157
    157
    158
    158
    159
    159
    160
    160
    161
    161
    162
    162
    163
    163
    164
    164
    165
    165
    166
    166

    Cosa sto sbagliando?
    Matteo Coletta - fotografia
    Fotografo Lanciano - Fotografia a Lanciano e Pescara

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    Ciao!
    Be' innanzi tutto è sbagliata la condizione di join

    Quando fai un join tra due tabelle, devi sempre specificare quali sono i campi secondo i quali unire le righe.

    Ti do un consiglio: per provare se il join funziona, la prima volta fai sempre Select * e vedi se ti crea la tabella come la vorresti, quando sei certo che la tabella viene creata correttamente, seleziona solo i campi che ti interessano!

    Provo a spiegarti quello che succede a te:

    Leggendo da wikipedia:

    Una inner join crea una nuova tabella combinando i valori delle due tabelle di partenza (A and B) basandosi su una certa regola di confronto. La query compara ogni riga della tabella A con ciascuna riga della tabella B cercando di soddisfare la regola di confronto definita. Quando la regola di join viene soddisfatta, i valori di tutte le colonne delle tabelle A e B vengono combinate in un'unica riga nella costruzione della tabella risultante.
    Quindi, quando fai un join devi sempre specificare la regola di confronto!!

    Vediamo cosa succede quando esegui la tua query:

    1) viene confrontata la prima riga della tabella categories con la prima riga della tabella a_data e viene analizzata la condizione, quindi se categories.brand = 1, la riga combinata viene messa nella tabella

    2) viene confrontata la prima riga della tabella categories con la seconda riga della tabella a_data e viene analizzata la condizione, quindi se categories.brand = 1, la riga combinata viene messa nella tabella

    3) così via fino alla fine della tabella a_data

    4) si riparte dalla seconda riga della tabella categories che viene confrontata con la prima riga della tabella a_data, poi con la seconda ecc

    5) si va avanti così fino ad arrivare alla fine della tabella categories.

    Sono stato chiaro?
    Se hai dubbi chiedi pure.

    Solo una domanda: la tabella a_data contiene solo due righe??
    Jekkil

  3. #3

  4. #4
    Utente di HTML.it L'avatar di bANART
    Registrato dal
    Jul 2005
    Messaggi
    662
    Oly hai ragione... sai cos'è, ho fatto come mi avevi detto nella discussione che hai linkato, poi, visto che c'erano altre condizioni da soddisfare mi sono perso il costrutto iniziale e sono andato nel pallone... poi però avevo ripreso proprio quella discussione e ho risolto!

    Jekkil sei stato davvero preciso ed esauriente, ti ringrazio.

    La tabella a_data ha tante righe quante categories.
    In realtà ho 4 tabelle, quando un utente si iscrive si crea una riga per ogni tabella, dove nella tabella users vengono inseriti i dati "anagrafici" (nome, cognome, sesso, email, ... ), nella tabella categories ci sono solo campi tinyint poichè si popolano tramite checkbox più un campo per controllare la data dell'uiltima modifica.
    Nelle altre due tabelle, a_data e gallery, ci sono svariati dati (in gallery i link alle immagini)

    A tal proposito volevo approfittare per farti una domanda... come faccio a fare una query join tra 3 o 4 tabelle?
    Matteo Coletta - fotografia
    Fotografo Lanciano - Fotografia a Lanciano e Pescara

  5. #5
    no è semplicissimo da spiegare aldilà di quanto ti è stato già detto sopra ma cmq lo schema è il seguente (+ o -)

    SELECT
    nome_tabella1.campo_tabella1,
    nome_tabella2.campo_tabella2,
    nome_tabella3.campo_tabella3
    FROM
    nome_tabella1
    INNER JOIN
    nome_tabella2 ON nome_tabella1.campo_in_comune1=nome_tabella2.campo _in_comune2
    INNER JOIN
    nome_tabella3 ON nome_tabella1.campo_in_comune3=nome_tabella3.campo _in_comune3
    WHERE
    etc etc

  6. #6
    Utente di HTML.it L'avatar di bANART
    Registrato dal
    Jul 2005
    Messaggi
    662
    ho capito.
    Quindi metto in relazione prima la prima tabella con la seconda e poi la prima con la terza utilizzando sempre lo stesso campo comune. Sembra abbastanza semplice.

    Perfetto, ora aggiusto un pelo la parte css e poi lo testo.

    Gazie mille, disponibili e gentilissimi come sempre
    Matteo Coletta - fotografia
    Fotografo Lanciano - Fotografia a Lanciano e Pescara

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.