Joomla.it Forum
Non solo Joomla... => Sviluppo => : devillino 04 Sep 2013, 11:10:20
-
Ciao ragazzi/e
mi servirebbe un consiglio, sono davanti a una select da un'ora e non riesco a capire l'errore io vorrei fare una select che estraesse da una tabella gmappa il record avente nel campo voti il voto più alto raggruppando però prima tutti i records per categoria; (però fra questi record devo prendere solo quelli che hanno un legame di amicizia espresso dalla tabella comprofiler_members [componente cb] tramite il campo meberid<->referenceid e siccome la user nella tabella gmappa non è l'id numerico ho messo nella join anche la tabella users).
ho abbozzato la seguente select:
$query= "select cont, categoria, nome, max(voto), descrizione
from #__gmappa AS p
right outer Join #__users AS u ON p.utente = u.username
right outer join #__comprofiler_members AS f ON u.id = f.referenceid
where f.memberid =" . $db->quote($user->id) ."
group by categoria";
riscritta anche nel seguente modo utilizzando le api di joomla (le ho trovate nella documentazione joomla):
$query
->select('u.username, p.cont, p.categoria, p.nome, p.voto, p.descrizione')
->from('#__gmappa AS p')
->join('RIGHT', '#__users AS u ON p.utente = u.username')
->join('RIGHT', '#__comprofiler_members AS f ON u.id = f.referenceid ')
->where('f.memberid='.$db->quote($user->id)
AND('accepted = 1') )
->group("categoria");
però con entrambi i codici (dovrebbero essere equivalenti) non ottengo il risultato desiderato ...potreste darmi qualche dritta sulle join? altra domanda ma quali delle due sintassi è meglio usare?? a me sembra più leggibile e modificabile la seconda voi che dite?
Ultima domanda, ma la seconda ha un nome particolare? (per trovare info più facilmente su google)
Grazie:)
-
capito il problema .... sbaglio l'uso della funzione max ...non mi restituisce l'intero record ma solo il valore maggiore per un determinato gruppo quindi devo studiare la select in modo differente!
restano aperte però le domande fatte nel primo post :)
-
la seconda ha un nome particolare? (per trovare info più facilmente su google)
banalmente è la classe query di joomla che modella la composizione delle query, ma su google troverai più facilemte l'argomento generale, ossia l'accesso al database con joomla
quando raggruppi i risultati di una select
group by categoria
non ottieni un singolo valore ma un record come volevi tu
specialmente quando metti in relazione più tabelle ti consiglio di usare gli alias
NOMETABELLA AS alias
-
esatto si si...con group by ottenevo quello che mi serviva però la cosa strana è quando utilizzavo anche la funzione max su un campo di tipo int: mi prendeva un record fra quelli della categoria e al suo interno piazzava il max di quella colonna che però stava in un'altro record :S; ho dovuto togliere il max e il group by e fare un algoritmo a manella :( ...facendo così avevo si un record per categoria con il campo max più alto (e fin qui ok!), ma con i gli altri campi valorizzati con valori di altri record (precisamente prendeva tutti gli altri campi pari ai campi del primo record che mi usciva dall'estrazione senza group by).
voi avete mai fatto prove simili? perchè altrimenti sbagliavo io ....nel caso ...la select è sbagliata?? :-\
-
Ciao.
Forse dovresti provare qualcosa del tipo:
select *from tabella_gamma
where voto = (select max(voto) from tabella_gamma)
Attenzione!! Se hai più record con uguale max(voto) ricevi in risposta più record.
-
ci ho pensato ma con le join e il group by non sapevo bene come risolvere ho preferito fare una funzioncina vicino dopo aver estratto i dati..fatti prima :)