Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [mysql] join

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111

    [mysql] join

    mi servirebbe un aiutino con questa query perchè da solo non ne vengo a capo

    SELECT A.*, B.ut_num, NICK, IMGEXT, C.THREAD, COUNT(ID)
    FROM post AS A JOIN utenti AS B JOIN comms AS C
    WHERE B.NICK = A.AUTORE AND C.THREAD = A.THREAD
    GROUP BY C.THREAD
    ORDER BY A.THREAD DESC


    il problema è che se nella tabella C (comms) non ci sono righe per cui venga soddisfatta la condizione WHERE, non viene prodotto alcun risultato.
    io avrei bisogno che venissero mostrati tutte le righe della tabella A (post) anche se nelle tabelle B e C non ci fossero valori corrispondenti

    ho provato a usare una outer join in questo modo:

    SELECT A.*, B.ut_num, NICK, IMGEXT, C.THREAD, COUNT(ID)
    FROM post AS A
    LEFT JOIN utenti AS B ON B.NICK = A.AUTORE
    LEFT JOIN comms AS C ON C.THREAD = A.THREAD
    WHERE B.NICK IS NULL AND C.THREAD IS NULL
    GROUP BY C.THREAD
    ORDER BY A.THREAD DESC


    ma così non mostra risultati nemmeno quando i dati nelle altre tabelle ci sono.

  2. #2
    codice:
    SELECT A.*, B.ut_num, NICK, IMGEXT, C.THREAD, COUNT(ID)
    FROM post AS A
    LEFT JOIN utenti AS B ON B.NICK = A.AUTORE
    LEFT JOIN comms AS C ON C.THREAD = A.THREAD
    GROUP BY A.THREAD
    ORDER BY A.THREAD DESC
    pero' se raggruppi non potrai avere tutto i record di A.

    Ricevi i record di A raggruppati per campo THREAD e nei campi mancanti di B e C un NULL.

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    grazie per l'aiuto

    THREAD, nella tabella A, è l'indice perciò posso vedere tutte le righe. il raggruppamento mi serve per contare quanti associazioni trovo nella tabella C per ogni voce di A (cioè quanti commenti per ogni post).

    così la query funziona, però il campo THREAD risulta nullo per le righe che non hanno associazioni in C (i post senza commenti). quel campo mi servirebbe come variabile url.

    grazie di nuovo

  4. #4
    Originariamente inviato da v.1
    grazie per l'aiuto

    THREAD, nella tabella A, è l'indice perciò posso vedere tutte le righe. il raggruppamento mi serve per contare quanti associazioni trovo nella tabella C per ogni voce di A (cioè quanti commenti per ogni post).

    così la query funziona, però il campo THREAD risulta nullo per le righe che non hanno associazioni in C (i post senza commenti). quel campo mi servirebbe come variabile url.

    grazie di nuovo
    ho copiato ed incollato....

    ovvio che devi prendere il campo della tabella A.THREAD nella selezione dei campi.

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    Originariamente inviato da piero.mac
    ho copiato ed incollato....
    no, hai tolto la clausola WHERE, e così quasi funziona

    Originariamente inviato da piero.mac
    ovvio che devi prendere il campo della tabella A.THREAD nella selezione dei campi.
    scusami ma non ho capito

  6. #6
    Originariamente inviato da v.1
    no, hai tolto la clausola WHERE, e così quasi funziona


    scusami ma non ho capito
    ho tolto la clausola where perche' cerchi il campo NULL in and tra le due tabelle. Questo servirebbe per vedere i campi di A che non sono associati a B && C. Quindi escluderebbe tutti i campi di A associati, mentre tu vorresti TUTTI i campi di A

    Ovviamente se il dato che selezioni e' C.THREAD ed in quel record C.THREAD non esiste, riceverai un NULL. Ora siccome in A.* c'e' anche il campo THREAD, devi selezionare A.THREAD e non C.THREAD. Perche'? dato che il nome del campo THREAD e' uguale in A ed in C ne consegue che C.THREAD essendo elencato dopo, sovrascrive A.THREAD .... quindi basta togliere C.THREAD perche' tra l'altro serve a nulla.

    SELECT A.*, B.ut_num, NICK, IMGEXT, COUNT(ID)

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    Originariamente inviato da piero.mac
    ho tolto la clausola where perche' cerchi il campo NULL in and tra le due tabelle. Questo servirebbe per vedere i campi di A che non sono associati a B && C. Quindi escluderebbe tutti i campi di A associati, mentre tu vorresti TUTTI i campi di A

    Ovviamente se il dato che selezioni e' C.THREAD ed in quel record C.THREAD non esiste, riceverai un NULL. Ora siccome in A.* c'e' anche il campo THREAD, devi selezionare A.THREAD e non C.THREAD. Perche'? dato che il nome del campo THREAD e' uguale in A ed in C ne consegue che C.THREAD essendo elencato dopo, sovrascrive A.THREAD .... quindi basta togliere C.THREAD perche' tra l'altro serve a nulla.

    SELECT A.*, B.ut_num, NICK, IMGEXT, COUNT(ID)
    chiarissimo! grazie mille ora funziona alla perfezione

    io avevo messo quel C.THREAD in più perchè pensavo fosse necessario a far capire alla funzione COUNT() che avrebbe dovuto lavorare sulla tabella C dato che C.COUNT() non lo vuole ...e invece era del tutto superfluo e anzi deletereo

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    111
    EDIT. scusate mi stavo sbagliando

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.