Ciao non devi mettere Rooms.room nelle select interne ma in quella esterna:
select Rooms.id_room
, Rooms.room
/*aggiungere qui altri campi separati da ,*/
, Ifnull(NDiscussioni,0) as NDiscussioni
, Ifnull(NRisposte,0) as NRisposte
, max_post_data
, nome_utente_post
...
Come vedi ho aggiunto Rooms.room come secondo campo ma nella query globale non nelle query interne. Le query interne servono solo per preparare i dati da visualizzare.
Se hai la necessità di esporre altri campi come Rooms.room ad esempio Rooms.room_floor o altro, aggiungile nella query principale dove ti ho inserito il commento.
Per quanto riguarda la spiegazione e l'aggiunta del nuovo campo, ho aggiornato il precedente post per non stare a riscrivere tutta la query visto che è lunghetta.
Il mio suggerimento è quello di fare la query a pezzi... parti dall'argomento principale (le Rooms), per ognuna di quelle estrai i dati che ti servono. Inoltre le varie query all'interno delle LEFT JOIN le puoi tranquillamente lanciare DA SOLE per vedere che dati ti estraggono.
Ricapitolando:
1) parti dalle Rooms (SELECT Rooms.* FROM ROOMS)
2) Calcoli il numero di discussioni e risposte in 2 QUERY SEPARATE:
select id_room, count(id_post) as NDiscussioni
from Post
group by id_room
...
select id_room, count(id_risposta ) as NRisposte
from Risposte
group by id_room
3) Calcoli l'ultimo post per ogni id_Room
select external_post.id_room
,external_post.id_post
,external_post.data as max_post_data
,utenti.id_utente as id_utente_post
,utenti.Nome + ' ' + utenti.Cognome as nome_utente_post
from Post as external_post
join Utenti
on external_post.id_utente = Utenti.id_utente
where id_post = (/*per ogni stanza recupero l'ultimo post*/
select internal_post.id_post
from Post as internal_post
where external_post.id_room = internal_post.id_room
order by internal_post.data desc LIMIT 0,1
)
4) fai la stesso cosa per le risposte di ogni post
select external_risposta.id_post
,external_risposta.data as max_risposta_data
,utenti.id_utente as id_utente_risposta
,utenti.Nome + ' ' + utenti.Cognome as nome_utente_risposta
from Risposte as external_risposta
join Utenti
on external_risposta.id_utente = Utenti.id_utente
where id_risposta = (/*per ogni post recupero l'ultima risposta*/
select internal_risposta.id_risposta
from Risposte as internal_risposta
where external_risposta.id_post = internal_risposta.id_post
order by internal_risposta.data desc LIMIT 0,1
)
5) metti assieme le cose con le eventuali LEFT JOIN.
Le query al punto 3) 4) servono solo per i post e per le risposte... non ti servono per avere informazioni sulle stanze, quindi non hanno bisogno di essere legate internamente alla Rooms (non ha senso quindi aggiungere qui il campo Rooms.room)... Il legame avviene per ultimo inserendo le varie LEFT JOIN.
Spero di essere stato chiaro.
Ciao e buone feste :)
PS: un'ultima cosa... prima dicevi che non riuscivi a trovare le tabelle internal_post, external_post ecc... queste non sono tabelle ma "alias" di tabelle... in pratica dei soprannomi che si danno alle tabelle per rendere più chiara la query e per evitare possibili uguaglianze di nomi.
Per esempio:
select pippo.nome, pippo.cognome
from persona as pippo
where pippo.nome = 'personaggio disney'
In pratica alla tabella "persona" do il nome di "pippo" perchè almeno è più chiaro a chi mi sto riferendo.
Modificato da roland79 il 23 dicembre 2011 13.50 -