Visualizzazione risultati 1 fino 14 di 14

Discussione: Inner join un pò complicato

  1. #1
    Guest

    Predefinito Inner join un pò complicato

    Ciao a tutti, devo creare una query un pò complicata e non so bene da dove partire

    Ho una tabella, page che contiene id_title, type time e id_user
    E una tabella friend che contiene id_user e id_friend.

    Devo scaricare:

    SELECT id_title WHERE (page.type = 'event' AND page.id_user = '$session_userid') OR (page.type = 'post' AND id_user = '') ORDER BY page.time DESC;

    il problema è che all'interno di id_user = '' dovrei inserire l'id ricavato da SELECT id_friend FROM friend WHERE id_user = '$session_userid';

    So che dovrei usare un inner join ma non riesco a capire come... Potete aiutarmi?

  2. #2
    Guest

    Predefinito

    In generale se hai due tabelle TBL1 e TBL2 fai:

    Codice:
    SELECT t1.field_1, t1.field_2, ..., t2.field_n
    FROM tbl1 AS t1
    INNER JOIN tbl2 AS t2 ON t1.id_1 = t2.id_2
    WHERE condizioni ...
    oppure (che è lo stesso)

    Codice:
    SELECT t1.field_1, t1.field_2, ..., t2.field_n
    FROM tbl1 AS t1, tbl2 AS t2 
    WHERE t1.id_1 = t2.id_2 AND altre condizioni ...

  3. #3
    Guest

    Predefinito

    Ciao, ho scritto questo

    Codice:
     $query_select_limit = "SELECT ".$prefix5."_page.id_title FROM ".$prefix5."_page WHERE (".$prefix5."_page.id_user = ".$prefix5."_friend.id_friend AND ".$prefix5."_friend.id_user = '$session_userid' AND ".$prefix5."_page.type = 'post') OR (".$prefix5."_page.type = 'event' AND ".$prefix5."_page.id_user = '$session_userid') ORDER BY ".$prefix5."_page.time DESC LIMIT $primo, $per_page";
    Ma ricevo questo errore "Unknown column 'worldte1_social.social_friend.id_friend' in 'where clause'"

    Solo che la colonna esiste....

  4. #4
    Guest

    Predefinito

    Si esiste sul db ma non l'hai inserita tra le tabelle FROM.
    Così come è scritta la query cerca i dati SOLO in worldte1_page.
    Devi elencare tutte le tabelle da dove prelevare dati (Nel tuo caso devi aggiungere anche worldte1_social all'interno di di FROM.

  5. #5
    Guest

    Predefinito

    Ciao ho dovuto farla un pò più complicata:

    Codice:
    $query_select_page = "SELECT ".$prefix5."_page.id_title FROM ".$prefix5."_page, ".$prefix5."_friend WHERE (".$prefix5."_page.id_user = ".$prefix5."_friend.id_friend AND ".$prefix5."_friend.id_user = '$session_userid' AND ".$prefix5."_page.type = 'post') OR (".$prefix5."_page.type = 'post' AND ".$prefix5."_page.id_user = '$session_userid') OR (".$prefix5."_page.type = 'event' AND ".$prefix5."_page.id_user = '$session_userid')";
    I dati nei db ci sono, quindi dovrebbe funzionare.....
    Credo che il problema sia qui:

    Codice:
    FROM ".$prefix5."_page, ".$prefix5."_friend
    Ma non ne sono sicuro.

  6. #6
    Guest

    Predefinito

    ... e dunque?

    Funziona o no?

    Che errore?

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da simpleticket Visualizza messaggio
    ... e dunque?

    Funziona o no?

    Che errore?
    :D Non trova nessun' campo, però non mi stampa nessun'errore...

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da onlinefreegame Visualizza messaggio
    :D Non trova nessun' campo, però non mi stampa nessun'errore...
    Occhio che nelle JOIN la select ti restituisce tutti i record della tabella 1 che hanno corrispondenza con la tabella 2. Tutti i record di tabella 1 che non hanno corrispondenti in tabella 2 non saranno recuperati.

    Sei sicuro che i record delle due tabelle siano correlati? I campi di correlazione li hai correttamente impostati. Ti consiglio di mettere la condizione di relazione esternamente all'OR

    WHERE t1.id1 = t2.id2 AND ((...) OR (...)) ...

    Prova a farti stampare il testo della query così come composta dal parser php e poi eseguila direttamente sul db, e vedi cosa succede ...

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da simpleticket Visualizza messaggio
    Occhio che nelle JOIN la select ti restituisce tutti i record della tabella 1 che hanno corrispondenza con la tabella 2. Tutti i record di tabella 1 che non hanno corrispondenti in tabella 2 non saranno recuperati.

    Sei sicuro che i record delle due tabelle siano correlati? I campi di correlazione li hai correttamente impostati. Ti consiglio di mettere la condizione di relazione esternamente all'OR

    WHERE t1.id1 = t2.id2 AND ((...) OR (...)) ...

    Prova a farti stampare il testo della query così come composta dal parser php e poi eseguila direttamente sul db, e vedi cosa succede ...
    Probabilmente il problema è questo, io utilizzo le due tabelle sono in una delle tre condizioni.

    Si può correggere questo errore?

  10. #10
    Guest

    Predefinito

    Certo. Esattamente come ti ho scritto.
    Poni la condizione di relazione per prima e poi dopo un AND il blocco con gli OR (usa le parentesi ;) )

  11. #11
    Guest

    Predefinito

    Codice:
    $query_select_page = "SELECT ".$prefix5."_page.id_title FROM ".$prefix5."_page, ".$prefix5."_friend WHERE (".$prefix5."_page.id_user = ".$prefix5."_friend.id_friend AND ".$prefix5."_friend.id_user = '$session_userid' AND ".$prefix5."_page.type = 'post') OR (".$prefix5."_page.type = 'post' AND ".$prefix5."_page.id_user = '$session_userid') OR (".$prefix5."_page.type = 'event' AND ".$prefix5."_page.id_user = '$session_userid')";
    Il Problema è che non ci sono condizioni in comune,

    Codice:
     (".$prefix5."_page.id_user = ".$prefix5."_friend.id_friend AND ".$prefix5."_friend.id_user = '$session_userid' AND ".$prefix5."_page.type = 'post')
    OR

    (".$prefix5."_page.type = 'post' AND ".$prefix5."_page.id_user = '$session_userid')
    OR

    Codice:
    (".$prefix5."_page.type = 'event' AND ".$prefix5."_page.id_user = '$session_userid')
    Solo nella condizione uno faccio uso di entrambi le tabelle...

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da onlinefreegame Visualizza messaggio
    Solo nella condizione uno faccio uso di entrambi le tabelle...
    Allora, la condizione di relazione serve a stabilire il legame tra le due tabelle e questo legame o c'è o non c'è. Quindi se scrivi una query che interroga due (o più) tabelle relazionate da un legame (fai attenzione perchè se non metti la relazione ti trovi un prodotto cartesiano col rischio di bloccare tutto) la relazione ci sarà sempre a prescindere da tutte le altre condizioni, altrimenti puoi usare una LEFT JOIN che ti prende TUTTI i record della tabella t1 a prescindere se questi hanno un corrispettivo su t2, e nel caso setta a NULL i valori di quest'ultima.

    Ma prima di scrivere qualcosa perchè non provi a leggere due righe sulle JOIN?

    prova così:

    Codice:
    $query_select_page = "SELECT ".$prefix5."_page.id_title FROM ".$prefix5."_page LEFT JOIN ".$prefix5."_friend ON ".$prefix5."_friend.id_friend = ".$prefix5."_page.id_user WHERE (".$prefix5."_page.type = 'post' AND ".$prefix5."_friend.id_user = '$session_userid')	OR (".$prefix5."_page.type = 'post' AND ".$prefix5."_page.id_user = '$session_userid') OR (".$prefix5."_page.type = 'event' AND ".$prefix5."_page.id_user = '$session_userid')";
    ... e per iniziare

    http://database.html.it/guide/lezion...so-delle-join/
    Ultima modifica di simpleticket : 14-08-2011 alle ore 09.15.59

  13. #13
    Guest

    Predefinito

    Ma per curiosità, com'è finita?
    Funziona?

  14. #14
    Guest

    Predefinito

    Grazie ho letto la guida e ho risolto...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •