Newsgroup: it.comp.www.php
Titolo: query mysql: magari mi potete aiutare voi

Salve a tutti,
so che non è questo il ng preposto per questo tipo di domande, ma non 
sono riuscito a trovare soluzioni altrove.
Ho 2 tabelle, una news e l'altra commenti cosi struttrate:
CREATE TABLE `news` (
   `idn`       int AUTO_INCREMENT NOT NULL,
   `titolo`    varchar(250) NOT NULL,
   `corpo`     text,
   `data`      date NOT NULL,
   `status`    tinyint(1),
   `id_cat`    int NOT NULL,
   `id_gal`    int,
   `id_video`  int,
   `mipiace`   int,
   `visite`    int,
   `img_rapp`  text,
   /* Keys */
   PRIMARY KEY (`idn`)
) ENGINE = MyISAM;
CREATE TABLE `commenti` (
   `idcom`       int AUTO_INCREMENT NOT NULL,
   `commento`    text,
   `data`        date,
   `id_user`     int,
   `pubblicato`  tinyint(1),
   `id_news`     int,
   /* Keys */
   PRIMARY KEY (`idcom`)
) ENGINE = MyISAM;
Come faccio per selezionare tutte le news che hanno almeno un commento e 
a ordinarle per news con piu commenti?
Ho provato con questa:
  select
   n.`idn`,
   n.`titolo`,
   n.`corpo`,
   n.`data`,
   n.`status`,
   n.`id_cat`,
   n.`id_gal`,
   n.`id_video`,
   n.`mipiace`,
   n.`visite`,
   n.`img_rapp`,
   c.stripe,
   c.nome,
  COUNT(com.idcom) as contatore,
  com.id_news
   from news as n
   INNER JOIN categorie as c ON id_cat = c.idc
   INNER JOIN commenti as com ON com.id_news=n.idn
   where status=1
   order by contatore
Ma non va poichè mi restituisce come contatore il numero di tutti i 
commenti inseriti per tutte le news, ma ancora peggio mi restituisce una 
sola news (e invece dovrebbero essere 2, in quanto sono le uniche con 
commenti).
Suggerimenti?
Grazie mille.
Franz

 ha scritto nel messaggio 
news:4c9c8cff$0$40290$4faf...@reader2.news.tin.it...

Ciao questa ti da le notizie che hanno almeno un commento (HAVING contatore 
 > 0) e le ordine per quelle con maggiore numero di commenti in modo 
decresecente.
SELECT COUNT(
news.id
) AS contatore, 
news.id
, news.titolo, comments.comm_id, 
comments.news_id FROM `news`, comments WHERE  comments.news_id = 
news.id
 AND 
comments.status = 1 GROUP BY 
news.id
 HAVING contatore > 0 ORDER BY contatore 
DESC LIMIT 0, 10
Ovviamente l'ho testato con le mie tabelle,pertanto sostituisci, nomi 
tabelle e nomi campo.
Ciao 

 HAVING contatore > 0 ORDER BY contatore DESC
Ti ringrazio tantissimo.
Ha funzionato alla grande.
Era molto piu semplice di quanto pensassi.
A volte mi incarto in cose che sono di una semplicità palese e io invece 
le rendo stracomplesse
Franz

Come faccio per selezionare tutte le news che hanno almeno un commento e 
SELECT n.idn, [altri campi di n],
	COUNT(com.idcom) AS contatore -- NESSUN ALTRO campo da com!
	FROM news AS n
	JOIN commenti as com ON (com.id_news = n.idn AND n.status = 1)
	GROUP BY n.idn [, altri campi di n]
	ORDER BY contatore DESC;
Poi, quando devi visualizzare i commenti di una certa news, fai una
seconda SELECT.
Altrimenti, ti tocca fare una subselect, e mi usma che sia costosetto; due
derived, due select da tabella temporanea (minimo), filesorting... dipende
ovviamente da quante news e commenti hai.
	SELECT	n.*,
		com.*
	FROM (
SELECT inner_n.idn, COUNT(inner_com.idcom) AS contatore
	FROM news AS inner_n
	JOIN commenti as inner_com ON (inner_com.id_news = inner_n.idn AND
inner_n.status = 1)
	GROUP BY inner_n.idn ) AS core
	JOIN news AS n ON (n.idn = core.idn)
	JOIN commenti AS com ON (com.id_news = core.idn)
	ORDER BY core.contatore DESC, ...
Ti puo' convenire un indice come questo:
CREATE INDEX core_ndx ON news ( idn, status, id_cat );
Potrebbe convenirti (il costo è inferiore che gestire un indice) avere - e
mantenere - un campo "contatore" dentro alla tabella news. Quando aggiungi
un commento incrementi il contatore, quando lo cancelli lo decrementi.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!