Newsgroup: it.comp.www.php
Titolo: [OT] count() mysql e altro

Chiedo scusa dell'OT, ma approfitto ;-) di voi chiedendovi un problema 
di cui non riesco a venire a capo.
Ho una tabella "parole" così fatta:
catID     parola     occorrenze
________________________________
1          audi        154
1          alfa         95
1          bmw         132
2          gomme        56
2          audi         80
In pratica, ho:
- un ID che specifica una data categoria
- una PAROLA
- il numero di OCCORRENZE di quella PAROLA in catID
'catID' e 'parola' INSIEME costituiscono la chiave primaria.
Io voglio arrivare (vi dico che mi serve per delle operazioni in php 
successive) a ottenere qualcosa di questo tipo, possibilmente in una 
sola istruzione:
catID    parola    occorr    parola_tot    tot_in_catID
________________________________________________________
1         audi      154       (154+80)          3
2         audi       80       (154+80)          2
Ovviamente ho messo i numeri fra parentesi invece del loro risultato 
solo per farvi capire come dovrebbe essere ottenuto il numero 
all'interno di quei campi.
Nello specifico:
- parola_tot: indica la somma del numero di occorrenze per una stessa 
parola (nel nostro esempio 154+80)
- tot_in_catID: indica la somma del numero di parole appartenenti a una 
data categoria
E' possibile realizzare questa cosa?
Sto usando mysql (anche 5 volendo).
--
rob4you

> E' possibile realizzare questa cosa?
Dal silenzio deduco non sia possibile. Mannaggia!
--
rob4you

 2         audi       80       (154+80)          2
in sostanza... la ricerca tu la fai sulla parola audi in questo caso ?
perchè è fattibilissimo basta usare o più query o una sub_query SQL

 perchè è fattibilissimo basta usare o più query o una sub_query SQL
Yes, in questo caso la faccio sulla parola 'audi'.
Ricapitolando, la tabella 'parole' che ho è:
catID     parola     occorrenze
________________________________
1          audi        154
1          alfa         95
1          bmw         132
2          gomme        56
2          audi         80
Nel caso specifico, voglio avere, con un'unica query (eventualmente 
anche fatta da più sub-query), i risultati seguenti:
catID    parola    occorr    parola_tot    tot_in_catID
________________________________________________________
1         audi      154       (154+80)          3
2         audi       80       (154+80)          2
In pratica voglio che siano visualizzate:
- le categorie (catID) in cui appare la parola 'audi'
- la parola 'audi' (vabbe, questo alla fine è pure superfluo)
- il numero di occorrenze della parola 'audi' secondo ciascuna 
categoria (in pratica è esattamente il campo 'occorrenze' della tabella 
principale)
- la somma dei campi occorrenze in cui compare la parola 'audi' nelle 
varie categorie (cioè nel nostro caso 154+80). Questo campo è 
ovviamente uguale per tutti i record in una stessa richiesta.
- il totale di parole per ciascuna categoria (e come vedi nella 
categoria 1 le parole sono in totale '3', nella categoria 2 sono in 
totale '2').
Non ho proprio capito come riuscire a ottenere questi risultati 
insieme, perché se effettuo un GROUP BY, riesco a ottenere solo 
determinate caratteristiche, ma non tutte insieme.
Riesci ad aiutarmi?
--
rob4you

 
select catID, parole, occorrenze, d.tot_in_catID, b.somma 
from rob4you 
join (select sum(occorrenze)as somma from rob4you where parole="audi") 
as b left join 
(select catID as c_catID, count(catID) as tot_in_catID 
 from rob4you as c group by c_catID) as d on catID=d.c_catID 
where parole="audi"
sicuramente si può ottenere in un modo più chiaro e leggibile... però
così dovrebbe funzionare
considera che sono un novellino... quindi magari ottimizzala

> considera che sono un novellino... quindi magari ottimizzala
Grazie della risp.
Scusa se non ho risp prima, ma mi era "sfuggita di mente" :-)
A fuor di spremuta di neuroni, avevo provato a tirare fuori una query, 
che faceva finalmente ciò che volevo, senza join.
La posto, anche se dubito che interesserà a qualcuno. :-)
Ah, fa qualcosa in più rispetto a quello che avevo chiesto 
inizialmente...ma come si sa...l'appetito vien mangiando! :-)
SELECT catID as ID,parola,occorrenze,t.somma,occorrenze/t.somma as 
divis,
@x:=(SELECT count(*) FROM parole WHERE catID=ID GROUP BY catID) as tot,
occorrenze/t.somma/@x as divis_tot FROM parole,
(SELECT sum(occorrenze) as somma FROM parole WHERE parola='aud') as t
WHERE parola='aud' ORDER BY divis_tot DESC;
Diciamo che su una tabella di circa ventimila righe risolve la query in 
un tempo accettabilissimo (qualche decimo di secondo).
Sicuramente ci sarà un modo per farla meglio, ma io sono ancora più 
novellino di te, quindi, di più non so! :-)
--
rob4you