Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Join

  1. #1

    Join

    Salve a tutti, ho un "piccolo" problemino ( suppongo concettuale ) sulle JOIN...

    Io ho 2 tabelle:

    nella prima ho dei nomi, nella seconda dei titoli e dei nomi ( corrispondenti con quelli della prima )

    Dovrei fare una selezione dei nomi della prima tabella che hanno un numero di titoli sull'altra tabella che è maggiore di 2...

    Esempio:

    TAB1 ha il campo NOME
    TAB2 ha il campo NOME e TITOLO

    TAB2 può avere più righe con stesso NOME ma diverso TITOLO

    Io mi muovo così:

    codice:
    select T1.NOME, COUNT(TITOLO) as NTitoli 
    from TAB1 as T1 JOIN TAB2 as T2 ON (T1.NOME = T2.NOME) 
    GROUP BY T1.NOME HAVING NTitoli > 2 order by NTitoli desc limit 10;
    Ovviamente questo è un esempio ristretto che non corrisponde al mio reale inquanto quest'ultimo ha diversi altri vincoli esplicitati nella where...

    Il mio problema è che per un numero di record bassi tutto va a meraviglia...

    Se la medesima query è eseguita su una grossa mole di dati va, addirittura, in crash il browser...

    Ecco il perchè del mio dubbio "concettuale"...

    Sapreste darmi qualche dritta...?

    Grazie per la pazienza

  2. #2
    Nell'esempio che hai portato non ti serve fare alcuna join.

    meglio usare un campo numerico invece di un campo varchar per unire due tabelle. oltretutto "nome" avrebbe molti valori duplicati nella tab2

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

  3. #3
    Grazie per l'intervento Piero ma il tutto non mi è chiaro

    Non occorre fare una JOIN...ok...questo dovrebbe essere il mio problema concettuale...

    Ma come posso raggiungere il mio obbiettivo...?

    Con una UNION...?

    Sto facendo non poca confusione...immagino la tua espressione...

    La domanda che devo porre al db è:

    "Preleva quei nomi che nella tabella T2 hanno almeno 2 titoli"

    Tu come glielo spiegheresti...?

  4. #4
    codice:
    SELECT nome, count(nome) as tot
    from tab2
    group by nome
    having tot > 1

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

  5. #5
    Perfetto...questo accadrebbe se avessi i dati tutti nella stessa tabella...

    Ma supponiamo che nella T1 io abbia anche il cognome della persona e che quindi volessi prelevare anche quello rispettando il vincolo dei 2 titoli...

    Devo utilizzare la JOIN no...?

    Io nel primo post ho volutamente omesso altri campi di interesse ( senza valutare che utilizzerò anche una terza tabella ) per non complicare l'esempio e far distogliere l'attenzione di coloro che sarebbero intervenuti...

    Ho messo in piazza le radici del problema in poche parole...

  6. #6
    La risposta e' congruente al quesito che hai posto. Se il problema ha aspetti piu' complessi proponi altri esempi reali.

    Come e' possibile che tu utilizzi il nome come campo comune se nella prima tabella potresti avere piu' nomi uguali con cognomi diversi? anche qui l'esempio non e' reale....


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

  7. #7
    Ti chiedo scusa per il mio essere impreciso...

    Ora sarò più chiaro...

    Tabella 1:

    contiene un elenco di nomi

    Tabella 2:

    contiene un elenco di titoli associati a dei nomi

    Tabella 3:

    contiene un elenco di voti associati a dei nomi

    In sostanza chiedo al database quali sono i nomi delle persone che hanno la media più alta di voti ed hanno pubblicato almeno 2 titoli...

    Supponi che queste persone pubblichino degli articoli e che gli articoli possano essere votati da altre persone...

    Un esempio reale sarebbe il seguente...

    Tabella 1:

    Mario
    Gigi
    Claudio

    Tabella 2:

    Mario - La vita è bella
    Mario - La vita è bellissima
    Gigi - Il mondo è bello
    Claudio - La donna è splendida

    Tabella 3:

    Mario - 5
    Gigi - 7
    Claudio - 10
    Mario - 3
    Claudio - 6

    E così via...

    Ovviamente il nome è utilizzabile da un solo utente e non da molteplici...

    Il nome è come se fosse un nick univoco...

  8. #8
    il campo che relaziona le tabelle dovrebbe essere numerico. Es.:

    tab1 -> id_nome, nome, altro
    tab2 -> id_titolo, id_nome, titolo, altro
    tab3 -> id_voto, id_nome, id_titolo, voto, altro.

    codice:
    select tab1.nome, count(tab2.id_titolo) as tot
    from tab2
    left join tab1 using(id_nome)
    group by tab2.id_nome
    having tot > 1
    ovviamente raggruppando per nome il voto relativo a "nome < vs > titolo" non ha senso.

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

  9. #9
    Appena provo ti faccio sapere

    Grazie ancora

  10. #10
    Niente da fare...

    Sempre al punto di partenza...

    Se il vincolo per l'utilizzo delle join è un campo numerico non le posso utilizzare...

    Le mie chiavi sono delle stringhe, nella fattispecie dei nomi...

    Grazie Piero...sei stato molto paziente

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.