Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Capire meglio JOIN

  1. #1

    Capire meglio JOIN

    Sono ai primi approcci con INNER JOIN
    ho tentato cercando nel forum, ma gli esempi trovati sono un pò troppo complessi perchè
    io possa capire una JOIN specifica alla mia esigenza che dovrebbe essere semplice.

    Da due tabelle devo estrarre dei record finalizzati allo stesso identificativo.
    Fino ad ora ho sempre fatto due o più query, ma vorrei imparare ad usare JOIN

    --Prima query

    SELECT nome, visitante, data FROM visite WHERE nome=utente

    --Seconda query

    SELECT gender FROM utenti WHERE nome=utente

    ... poi dopo ciclo gli utenti While Not Rs.EOF... etc


    Vorrei unirle per fare una sola SELECT, se qualcuno mi fa un esempio,
    per capire logica e sintassi della JOIN, poi andrò avanti basandomi su quello.

    Grazie mille
    http://www.romagnamania.com
    Una community tutta gratis per chi ama la Romagna.

  2. #2
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    I due campi dovrebbero essere in chiave... messa così non si evince granché.
    Magari uno dei due contatore.
    Cioè dovresti rivedere un po' la struttura delle tabelle, creare una tabella utenti ed utilizzare l'ideintificativo univoco per la relazione.
    Comunque:

    codice:
    SELECT visite.nome, visite.visitante, visite.data, utenti.gender FROM visite INNER JOIN utenti ON visite.nome = utenti.nome WHERE visite.nome='"& utente &"'"
    Roby

  3. #3
    Intanto grazie, ho applicato la select (usando i campi effettivi) diversi dall'esempio prima.

    SELECT tuevisite.tLogin, tuevisite.tVisitante, tuevisite.tData, users.uGender FROM tuevisite INNER JOIN users ON tuevisite.tLogin = users.uLogin WHERE tuevisite.tLogin = '" &_
    nome & "' ORDER BY tData DESC LIMIT "
    & (myPage*iTop)

    Praticamente la query domanda al DB le persone che hanno visitato un determinato profilo,
    estraendo dalla tabella tuevisite il nome e altri dettagli, effettivamente avrebbe un campo tID che non uso in quanto diverso dall'ID della tabella users.
    Identifico con nome .

    Tuttavia per prelevare GENDER devo andare a cercare dalla tabella users il sesso in corrispondenza dei nomi estratti dalla tabella precedente (tuevisite)

    Ora come sopra, trova l'oggetto listando i nomi trovati, però il gender mi da sempre maschio...

    Facendo Response della QUERY :
    SELECT tuevisite.tLogin, tuevisite.tVisitante, tuevisite.tData, users.uGender FROM tuevisite INNER JOIN users ON tuevisite.tLogin = users.uLogin WHERE tuevisite.tLogin = 'cristiano' ORDER BY tData DESC LIMIT 4


    Cosa potrebbe essere sbagliato?
    Grazie
    http://www.romagnamania.com
    Una community tutta gratis per chi ama la Romagna.

  4. #4
    Originariamente inviato da cristiano1972
    Intanto grazie, ho applicato la select (usando i campi effettivi) diversi dall'esempio prima.

    & (myPage*iTop)

    Praticamente la query domanda al DB le persone che hanno visitato un determinato profilo,
    estraendo dalla tabella tuevisite il nome e altri dettagli, effettivamente avrebbe un campo tID che non uso in quanto diverso dall'ID della tabella users.
    Identifico con nome .

    Tuttavia per prelevare GENDER devo andare a cercare dalla tabella users il sesso in corrispondenza dei nomi estratti dalla tabella precedente (tuevisite)

    Ora come sopra, trova l'oggetto listando i nomi trovati, però il gender mi da sempre maschio...

    Facendo Response della QUERY :
    SELECT tuevisite.tLogin, tuevisite.tVisitante, tuevisite.tData, users.uGender
    FROM tuevisite INNER JOIN users ON tuevisite.tLogin = users.uLogin WHERE tuevisite.tLogin = 'cristiano' ORDER BY tData DESC LIMIT 4


    Cosa potrebbe essere sbagliato?
    Grazie
    Ciao,

    ...a giudicare dai nomi dei campi sembra che vadano interpretati come segue :

    - tuevisite.tLogin : IDentifica colui che è stato visitato (...dovrebbe essere l'IDentificativo univoco di un record in users)

    - tuevisite.tVisitante : colui che lo ha visitato (...come sopra)

    Se è cosi hai sbagliato la condizione di join che deve essere

    codice:
    SELECT tuevisite.tLogin, tuevisite.tVisitante, tuevisite.tData, users.uGender
    FROM tuevisite INNER JOIN users ON tuevisite.tVisitante = users.uLogin
    WHERE tuevisite.tLogin = 'cristiano'
    ... così come l'hai scritta tu invece ti ritorna sempre il sesso di 'cristiano' nel caso in questione

    HTH

  5. #5
    Infatti stavo cercando di capire perchè mi dava i record in modo diverso da come doveva,
    ora così va ti ringrazio.

    SELECT tuevisite.tLogin, tuevisite.tVisitante, tuevisite.tData, users.uGender
    FROM tuevisite INNER JOIN users ON tuevisite.tVisitante = users.uLogin
    WHERE tuevisite.tLogin = 'cristiano' ORDER BY tuevisite.tData DESC LIMIT 6
    Dagli utenti estraggo quindi:

    -TEBLE tuevisite
    Nome
    Nome visitante
    Data della visita

    -TEBLE users
    sesso

    -TEBLE Avatars, usersf
    Immagine e Patch immagine

    In pratica sto estraendo anche la relativa immagine del profilo,
    però lo sto facendo in un modo che non sono sicuro che sia corretto,
    in quanto il WHILE gira su RS e al suo interno chiedo la foto ovviamente con Rs2.
    Tuttavia però funziona.


    While Not Rs .EOF

    Response.Write Sesso|nome|data


    'sempre nello stesso ciclo estraggo anche la foto con Rs2 però

    SELECT AvatarPrivate,AvatarPath FROM Avatars, usersf WHERE UserAvatar = AvatarID and UserLogin = '" & Rs ("tVisitante") & "'"
    Set Rs2 = DBRecordSet(oCn, rSQL)



    Rs.MoveNext
    WEnd

    'Esco

    Mi piacerebbe sapere se può essere corretto così, oppure converrebbe integrare anche quest'ultima richiesta all'interno di una sola QUERY.
    Ho visto query con parentesi per dare delle priorità.
    http://www.romagnamania.com
    Una community tutta gratis per chi ama la Romagna.

  6. #6
    Originariamente inviato da cristiano1972
    Infatti stavo cercando di capire perchè mi dava i record in modo diverso da come doveva,
    ora così va ti ringrazio.



    Dagli utenti estraggo quindi:

    ..............

    Mi piacerebbe sapere se può essere corretto così, oppure converrebbe integrare anche quest'ultima richiesta all'interno di una sola QUERY.
    Ho visto query con parentesi per dare delle priorità.
    Puoi fare tutto con un'unica query però a condizione di strutturare bene il db
    e nel tuo caso, come ti è stato già fatto notare, non sembra che la struttura sia delle migliori;

    per esempio non capisco perchè in tbvisite hai il nome del visitante e del visitato
    quando, a mio parere, ci andrebbe l'IDUser che lo relaziona alla tabella User dei dati anagrafici
    degli utenti.

    Forse oltre alle join ti conviene guardare anche come strutturare un db
    altrimenti non c'è nè join nè codice che tenga

    Ciao nella speranza di esserti stato di aiuto.

  7. #7
    Nella tabella tuevisite, come indice primario c'è solo un campo tID
    che è poi quello che si autoincrementa ad ogni INSERT INTO.

    Nella tabella tuevisite, vengono scritti i vari dati della persona che ti visita, omettendo effettivamente l' ID originale presente nella tabella USER.

    Per migliorare le relazioni, mi consigli di aggiungere un campo userID,
    dove al suo interno vado a scrivere l'ID utente presente nella tabella users dei dati anagrafici.

    Esempio:

    Tabella tuevisite :

    tID (auto incrementante)
    userID (stesso ID prelevato dalla tabella user)
    tLogin (del visitato)
    tVisitante (chi mi visita)
    tData

    In questo modo la struttura e le relazioni sarebbero corrette?

    Di nuovo grazie
    http://www.romagnamania.com
    Una community tutta gratis per chi ama la Romagna.

  8. #8
    Originariamente inviato da cristiano1972
    Nella tabella tuevisite, come indice primario c'è solo un campo tID
    che è poi quello che si autoincrementa ad ogni INSERT INTO.

    Nella tabella tuevisite, vengono scritti i vari dati della persona che ti visita, omettendo effettivamente l' ID originale presente nella tabella USER.

    Per migliorare le relazioni, mi consigli di aggiungere un campo userID,
    dove al suo interno vado a scrivere l'ID utente presente nella tabella users dei dati anagrafici.

    Esempio:

    Tabella tuevisite :

    tID (auto incrementante)
    userID (stesso ID prelevato dalla tabella user)
    tLogin (del visitato)
    tVisitante (chi mi visita)
    tData

    In questo modo la struttura e le relazioni sarebbero corrette?

    Di nuovo grazie
    .....non ho capito cosa sono tLogin e tVisitante;

    premesso che non so quali siano le tue necessità , personalmente farei così

    tbUsers
    ----------
    IDUsers (PK, Autoincreamentante)
    ...dati anagrafici....
    volendo si può aggiungere un qualche vincolo
    di univocità per esempio sull' e-mail o codice fiscale o ... boh ...

    tbVisite
    ----------
    IDVisita (PK, Autoincreamentante)
    IDUserVisitato (FK su tbUsers)
    IDUserVisitante (FK su tbUsers)
    DataVisita

    Duplicare i dati anagrafici in tbVisite ha senso solo
    se vuoi conservarli così come erano al momento della visita

    ... ma non so se è questo che vuoi ed in ogni caso
    mi sembra che IDUserVisitato ed IDUserVisitante
    siano necessari per avere un riferimento alle anagrafiche
    dei 2 soggetti.

    Inoltre direi che il campo da usare nei join delle tue query
    non dovrebbe essere il Nome ma IDUserVisitante
    perchè il nome forse potrebbe anche essere modificato
    con la conseguenza di perdere il collegamento con l'anagrafica.

    Ciao.

  9. #9
    Molto perspicace l'osservazione di usare l'ID al posto del nome,
    qualche volta mi è successo di avere richieste di modifica Nick.

    Faccio chiarezza su i due campi dove hai dubbi.

    Il sito ha una serie di iscritti con relativo profilo,
    ogni utente iscritto è presente con i dati anagrafici nella tabella users


    Ecco parte della struttura della tabella users

    |uID|uLogin|uPassword|uDate| etc ....


    Naturalmente ogni untente loggato, ha una propria sessione a cui viene dato un nome Pseudo scelto in fase di registrazione.

    Sto facendo in modo che ogni utente loggato veda la lista di utenti
    che visitano il suo profilo.

    Se Marco visita il profilo di Andrera, Andrea vedrà apparire il nome di Marco,
    con data della visita, foto e nome di chi lo ha visitato.

    Per fare apparire questi dati, ho creato una tabella dedicata chiamata appunto
    tvisite

    Ecco la struttura della tabella tvisite

    |tID|tlogin|tvisitante|tData|

    -nel campo tlogin viene scritto il nome del proprietario del profilo,
    cioè se io sono loggato con Cristiano, il mio nome viene scritto li.


    -nel campo tvisitante viene scritto il nome della persona che mi ha visitato,
    ovvero se Marco visita Cristiano, nel campo tVisitato viene scritto Marco.


    Una vosta scritti i dati sopra, posso finalmente,
    estrarre tute le persone che mi hanno visitato,

    SELECT * FROM tvisite FROM tlogin=cristiano

    Visualizzo tutte le persone che hanno visitato il profilo di Cristiano.
    http://www.romagnamania.com
    Una community tutta gratis per chi ama la Romagna.

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.