Newsgroup: it.comp.www.php
Titolo: [MySql] query con COUNT (credo che ci voglia un count...)

ciao, ho 2 tabelle:
utente:
|id|nome|cognome|num|
num è un numero che mi serve per ordinarli, lo inserisce l'utente
hobby:
|id|idUtente|nomeHobby|tipo|
devo fare una query che mi mostri gli utenti, ordinati prima per
numero di hobby che hanno (righe nella tabella hobby), poi per il num
della loro tabella....
inoltre, dovrei anche mettere delle clausole WHERE nella selezione
dell'hobby, ad esempio " WHERE hobby.tipo = '2' "
un aiutino?

DaNieL ha scritto:

leggiti il manuale alle voci JOIN, WHERE e ORDER BY. E' facile e ti apre 
la mente :-)
bye!!!
-- 
elimina unsampdoriano per rispondere via email

 la mente :-)
ovviamente anche COUNT e GROUP BY


 num è un numero che mi serve per ordinarli, lo inserisce l'utente
????

Generale_cluster, hai perfettamente ragione, ma adesso devo finire
questo codice in fretta, poi logicamente mi studierò l'argomento..
cmq, faccio un esempio:
utente:
|id|nome|cognome|num|
|1|pippo|rossi|2|
|2|pluto|bianchi|3|
3|paperino|verdi|1|
hobby:
|id|idUtente|nomeHobby|tipo|
|1|1|calcio|a|
|2|1|francobolli|b|
|3|2|palestra|a|
|4|2|basket|a|
|5|2|calcio|a|
allora, se tutti gli utenti hanno lo stesso numero di hobby, dovrei
stamparli ordinandoli per 'num', cioè:
3|paperino|verdi|1|
|1|pippo|rossi|2|
|2|pluto|bianchi|3|
..e fin qui nessun problema.
il problema è che, invece, il numero di hobby (cioè di righe nella
tabella hobby associate ad ogni utente) ha la priorità sul campo
'num', quindi, visto che 'pluto' ha 3 hobby (palestra, basket, calcio)
dovrà essere stampato per primo, pippo per secondo (ha 2 hobby), e
paperino per ultimo (non ha neanche un hobby).
e dovrei anche eseguire una clausola WHERE sugli hobby..
così a naso, dovrebbe essere una cosa del tipo:
"SELECT 
utente.id
, utente.nome, COUNT(hobby.idUtente) as numHobby FROM
utente LEFT JOIN hobby ON (
utente.id
 = hobby.idUtente) WHERE
hobby.tipo != '$x' GROUP BY 
utente.id
 ORDER BY numHobby DESC,
utente.num DESC"

 e dovrei anche eseguire una clausola WHERE sugli hobby..
Non puoi aggiungere nella tabella degli utenti il campo "totale_hobby"
ed ogni volta che un utente aggiunge/rimuove un hobby incrementi/
decrementi quel numero, così vai a ordinare in base a quello?
Ripeto: continua a non essermi chiarissima la situazione in cui stai
lavorando...

Allora... comincio col dire che io non sono il genio di questo ng e
che troverai persone molto (ma molto) più competenti di me.
Ora: o non mi è chiara la situazione, oppure non è chiara nemmeno a
te, cioè secondo me stai utilizzando un approccio completamento
sbagliato.
Se riesco ad "immaginare" quello che tu vorresti fare, io farei così:
crei due tabelle
"utenti"
"hobbies"
Nella tabella hobbies specifichi i tipi di hobbies disponibili, ovvero
idHobby | nomeHobby
------------ | -----------------
1           | calcio
2           | basket
Nella tabella utenti, invece, aggiungi due campi:
"totHobbies" e "arrayHobbies"
In totHobbies tieni il conto degli hobbies dell'utente, ovvero ogni
volta che l'utente va ad aggiungere un hobby incrementi il numero,
ogni volta che ne va a rimuovere uno lo decrementi.
In arrayHobbies, invece, vai a serializzare un array che contiene gli
id degli Hobby (che poi vai a collegare alla tabella contenente i nomi
degli hobby) e lo deserializzi ogni volta che ne hai bisogno.
In questo modo, ti basta ordinare per "num" e "totHobbies", e quando
vuoi stampare il nome degli Hobbies deserializzi l'array, estrai i
nomi degli hobby e colleghi gli id.

 decrementi quel numero, cosě vai a ordinare in base a quello?
Tutte le scelte dipendono dal contesto ma, se possibile, meglio evitare 
un campo totale (non hai problemi di aggiornamento etc)
Per tornare al problema specifico, anche se largamente OT, quale 
risultato ottieni con la tua query e cosa vorresti ottenere?
	Francesco

 questo codice in fretta, poi logicamente mi studierò l'argomento..
Male, molto male!!!
mysql> select * from utenti;
+----+---------+--------+
| id | nome    | ordine |
+----+---------+--------+
|  1 | Utente1 |      1 |
|  2 | Utente2 |      2 |
|  3 | Utente3 |     50 |
|  4 | Utente4 |     99 |
+----+---------+--------+
mysql> select * from hobby order by id_utente;
+----+-----------+----------+
| id | id_utente | hobby    |
+----+-----------+----------+
|  1 |         1 | Hobby1   |
|  9 |         1 | NoHobby1 |
|  3 |         1 | Hobby3   |
|  2 |         1 | Hobby2   |
| 31 |         2 | NoHobby6 |
| 27 |         2 | NoHobby5 |
| 40 |         2 | NoHobby2 |
| 35 |         2 | NoHobby3 |
| 41 |         2 | NoHobby4 |
| 34 |         2 | NoHobby1 |
|  6 |         2 | Hobby3   |
|  5 |         2 | Hobby2   |
|  8 |         3 | Hobby5   |
|  7 |         3 | Hobby4   |
|  4 |         3 | Hobby1   |
| 29 |         4 | NoHobby4 |
+----+-----------+----------+
mysql> select utenti.nome, count(
hobby.id
) as NrHobby, ordine
from utenti left join hobby on(
utenti.id
 = hobby.id_utente)
where hobby.hobby like 'Hob%'
group by 
utenti.id
 order by NrHobby DESC,  ordine DESC;
+---------+---------+--------+
| nome    | NrHobby | ordine |
+---------+---------+--------+
| Utente3 |       3 |     50 |
| Utente1 |       3 |      1 |
| Utente2 |       2 |      2 |
+---------+---------+--------+
mysql> select utenti.nome, count(
hobby.id
) as NrHobby, ordine
from utenti left join hobby
on(
utenti.id
 = hobby.id_utente and hobby.hobby like 'Hob%')
group by 
utenti.id
 order by NrHobby DESC,  ordine DESC;
+---------+---------+--------+
| nome    | NrHobby | ordine |
+---------+---------+--------+
| Utente3 |       3 |     50 |
| Utente1 |       3 |      1 |
| Utente2 |       2 |      2 |
| Utente4 |       0 |     99 |
+---------+---------+--------+
Capire la differenza tra la penultima e l'ultima query è la lezione per 
casa :-)
	Francesco

grazie a tutti per le risposte, alla fine mi sembra di aver capito che
quella che fà al caso mia è la penultima postata da francesco (..e il
fatto che sia molto simile a quella che avevo provato ad abbozzare mi
fà piacere :D)
cmq, Mirko, la tua soluzione sarebbe ottimale, ma quello che ho
postato è un esempio, le tabelle sono in realtà molto più complicate,
e con vari intrecciamenti tra loro..
e il problema del tenere la tabella coi totali aggiornati, è un bel
problema... perchè quegli 'hobby' avranno anche una data di inizio e
una di fine (per fare un esempio), per questo mi serve che la query
faccia il conto valutando X clausole WHERE..
vabhè, stavolta mi è andata bene che mi avete aiutato, non appena ho
un pò di respiro mi studio il manuale..
grazie!

 una di fine (per fare un esempio)
L'avevo detto io che il contesto non era chiarissimo :P