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

    Query di un dato da tutti gli amici

    Ciao a tutti,
    ho un piccolo quesito per capire se c'è una strada "più corta" o comunque, più pulita per raggingere il risultato di cui ho bisogno.

    In pratica ho 3 semplici tabelle:

    - Tabella Utenti
    - Tabella Articoli
    - Tabella Amici

    Ora, vorrei fare una query per vedere tutti i post di tutti i miei amici.

    La via più facile è stata quella di fare un ciclo, ovvero:

    Select join tra utenti e articoli WHERE idutente =
    [ciclo while SELECT miei amici che stampa tutti gli OR .... { idutente = 12 OR idutente = 9812 OR idutente = 4232} ] ecc ecc.

    Ora, ho provato a giocare un pò con le Subquery ma tra un errore e l'altro non sono riuscito ad arrivare a capo della soluzione ... qualora ce ne fosse uno.

    E' quindi giusto fare un ciclo con tutti gli OR oppure lo si può fare ugualmente con una subquery?



    Grazie mille!
    Perchè uso Maxthon? | Mi piace questa chat

  2. #2
    Cosi' ad una prima occhiata direi che ti manca una tabella.

    Siccome molti utenti potrebbero avere molti amici e molti amici potrebbero esserlo di piu' utenti andresti in una condizione abbastanza difficile da gestire di molti a molti.

    Quindi direi una tabella di unione utenti <-> amici. tre semplici campi:

    id - id_utente - id_amico

    con una semplice join troverai tutti gli amici del singolo utente e viceversa.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Ciao piero,
    perchè mi manca una tabella???

    La mia situazione attuale è la seguente:

    codice:
    # Tbl Utenti
    ID | NICK | CITTA
    
    # Tbl Amici
    IDAMICIZIA | ID1 | ID2 | ACCETTATO
    
    # Tbl Articoli
    IDART | IDUTENTE | ARTICOLO
    Ora, io sono l'utente 732 e vorrei vedere gli articoli di tutti i miei amici.

    Con questa query ho semplicemente tutti gli articoli, ora dovrei FILTRARI per i soli miei amici.

    codice:
    SELECT * FROM articoli
    JOIN utenti ON id = idutente
    La select per generare la lista dei miei amici io l'ho fatta così:

    [CODE]
    SELECT * FROM friend_list WHERE id2 = '732' AND accept = 1
    UNION
    SELECT * FROM friend_list WHERE id1 = '732' AND accept = 1
    [/c

  4. #4
    ma cosa sono id1 e id2 ????

    Dal tuo primo post si evince che se fai la subquery e' perche' ti manca la relazione tra utente e amici

    Invece di cercare tutti gli articoli cerca solo quelli dei tuoi amici con la condizione che siano tuoi amici.

    select *
    from articoli
    inner join amici on idart = id_amici(id1 o id2)
    inner join utenti on id(utente) = id_amici(1 o 2)
    where id(utente) = 732

    se le tabella sono relazionate dovrebbe funzionare. Vedi tu quali sono gli id appropriati

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Id1 e id2 sono gli id della tabella amici che è cosi fatta:

    # TBL AMICI

    id1 | id2 | accept |
    34 | 11 | 1
    11 | 87 | 1
    11 | 43 | 1

    ecc ecc.

    Il problema appunto, è che il mio amico, può stare nell'id1 o nell'id2, accompagnato ovviamente dal mio id.

    Quindi questo passaggio

    codice:
    inner join amici on idart = id_amici(id1 o id2)
    dovrebbe in teoria avere un OR di cui sopra
    codice:
    inner join amici on idart = id1 OR id2
    Ma cosi non credo possa funzionare.
    Perchè uso Maxthon? | Mi piace questa chat

  6. #6
    Utente di HTML.it L'avatar di Luke70
    Registrato dal
    Jul 1999
    Messaggi
    767
    Sicuramente idart = id1 OR id2 non fa quello che speri tu (verifica infatti che idart sia uguale a id1 oppure che id2 sia non falso)

    Prova idart = id1 OR idart = id2

    Non ho modo di verificare adesso però.

    Solitamente per evitare questo tipo di problemi, io inserisco le coppie reciproche nella tabella relazioni (stando attento a non fare casini quando fai modifiche).

  7. #7
    Mmm ... qualcosa non quadra, mi da 134.000 risultati (che è il totale degli utenti che ho nella tabella utenti) quando invece me ne dovrebbe dare una decina scarsa.

    codice:
    select *
    from articoli
    inner join friend_list on idutente = id1 OR idutente = id2
    inner join utenti on idutente = id1 OR idutente = id2
    WHERE id1 = 732 OR id2 = 732
    Ho paura che la strada più percorribile sia quella del ciclo while
    Perchè uso Maxthon? | Mi piace questa chat

  8. #8
    Io non ti ho messo una OR ma non sapendo quale sia il riferimento della tabella ho scritto o uno oppure l'altro.

    Quello che ti avevo detto riguardo la tabella di unione tra utenti e amici continua ad essere valido. Devi avere un solo record di riferimento e deve sempre essere lo stesso e non su id1 oppure id2

    tabella utenti
    id_utente, altro

    tabella articoli
    id_articolo, id_utente, altro

    tabella amici
    id_amico, id1_utente, id2utente

    un articolo e' sempre scritto da un utente, l'utente puo' avere tanti amici (che sono altri utenti), un utente puo' essere amico di vari altri utenti

    Se l'utente di riferimento che chiede amicizia mettiamo sia id1 l'utente che la concede sara' id2. Non puo' essere mai che una volta stabilita' la relazione di amicizia tra due utenti ci possano essere ulteriori record (con valori invertiti id1 e id2) ed avere cosi' un cross point. In pratica devi eseguire un controllo per cui se gia' esiste un record di unione di amicizia tra due utenti non se ne possa fare un altro.

    Rimane il fatto che non puoi conoscere a priori se l'amico appartiene a chi lo ha chiesto oppure a chi lo ha concesso.

    Se quanto credo di aver capito corrisponde al reale proverei con una UNION oppure due join sulla stessa tabella.

    codice:
    (select *
    from utenti
    inner join amici on amici.id1_utente = id_utente
    inner join articoli on articoli.id_articolo = utenti.id_utente
    where id_utente = 732)
    UNION
    (select *
    from utenti
    inner join amici on amici.id2_utente = id_utente
    inner join articoli on articoli.id_articolo = utenti.id_utente
    where id_utente = 732)
    due join li puoi invece fare usando l'alias della tabella

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Originariamente inviato da piero.mac

    Quello che ti avevo detto riguardo la tabella di unione tra utenti e amici continua ad essere valido. Devi avere un solo record di riferimento e deve sempre essere lo stesso e non su id1 oppure id2

    tabella amici
    id_amico, id1_utente, id2utente
    Forse non mi sono spiegato, id1 e 1d2 lo è chiaramente e unicamente solo per la tabella di amici, proprio perchè, come anche da te detto, non posso sapere se un dato utente è nella colonna 1 o 2, se è stato lui a ricevere o inviare.

    Se l'utente di riferimento che chiede amicizia mettiamo sia id1 l'utente che la concede sara' id2. Non puo' essere mai che una volta stabilita' la relazione di amicizia tra due utenti ci possano essere ulteriori record (con valori invertiti id1 e id2) ed avere cosi' un cross point. In pratica devi eseguire un controllo per cui se gia' esiste un record di unione di amicizia tra due utenti non se ne possa fare un altro.

    Rimane il fatto che non puoi conoscere a priori se l'amico appartiene a chi lo ha chiesto oppure a chi lo ha concesso.
    E' già cosi probabilmente non mi sono spiegato bene, ed il problema nasce proprio dal fatto che ci troviamo i nostri eventuali amici o nella colonna 1 o nella 2, senza saperlo.


    Se quanto credo di aver capito corrisponde al reale proverei con una UNION oppure due join sulla stessa tabella.

    codice:
    (select *
    from utenti
    inner join amici on amici.id1_utente = id_utente
    inner join articoli on articoli.id_articolo = utenti.id_utente
    where id_utente = 732)
    UNION
    (select *
    from utenti
    inner join amici on amici.id2_utente = id_utente
    inner join articoli on articoli.id_articolo = utenti.id_utente
    where id_utente = 732)
    due join li puoi invece fare usando l'alias della tabella
    Avevo pensato anche io ad una UNION così, ma c'è un errore fondamentale,
    ovvero

    codice:
    inner join articoli on articoli.id_articolo = utenti.id_utente
    Cosi io gli sto chiedendo solo gli articoli dell'id utente che abbiamo specificato nella clausola WHERE, ovvero il 732, invece noi dobbiamo stampare TUTTI gli articoli dei soli amici dell'utente 732.

    Mi rendo conto, un bel casino!!!!
    Perchè uso Maxthon? | Mi piace questa chat

  10. #10
    prova ad aggiungi un or
    codice:
    (select *
    from utenti
    inner join amici on amici.id1_utente = id_utente
    inner join articoli as a on (a.id_articolo = utenti.id_utente)
                             OR (a.id_articolo = amici.id1_utente)
    where id_utente = 732)
    UNION
    (select *
    from utenti
    inner join amici on amici.id2_utente = id_utente
    inner join articoli as a on (a.id_articolo = utenti.id_utente)
                             OR (a.id_articolo = amici.id2_utente)
    where id_utente = 732)
    con la union eventuali record identici verrebbero sovrascritti

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.