PDA

View Full Version : [PHP, MySQL] problematica mysql_num_rows


bouncey2k
03-01-2008, 00:15
Ho un ciclo che mi mostra alcuni articoli del database


$select = mysql_query ("SELECT * FROM articoli LIMIT 0,5", $db);
while ($record = mysql_fetch_array ($select))
{
echo "<p>{$record['testo']}</p>";
}


in un'altra tabella "commenti" (nello stesso database) ho i commenti agli articoli; vorrei inserire il loro numero sotto il $record['testo']:

{
echo "<p>{$record['testo']}</p>";
echo "<p>(n.commenti $num_righe)</p>";
}


Per fare questo ho scritto due righe fuori dal ciclo while:


$select_count = mysql_query ("SELECT * FROM commenti WHERE link_b = '$id' ", $db);
$num_righe = mysql_num_rows($select_count);


Solo che non funziona perché pare che il while legga l'altra $select e non quella del conteggio righe.

Ho provato il codice senza il while e il numero delle righe me le legge.
Come potrei fare?

vizzz
03-01-2008, 00:27
sapere per esteso la struttura delle tabelle chiarirebbe le cose, comuque ad occhio una soluzione veloce (forse non la migliore) sarebbe per ogni articolo di cui mostri il testo effettuare la query per ottenere il numero di commenti.
sapendo la struttura completa magari è possibile fare la stessa cosa con una query sola utilizzando una join.

kk3z
03-01-2008, 10:00
$select = mysql_query ("SELECT a.*, COUNT(c.id) num_commenti
FROM articoli a
LEFT JOIN commenti c ON c.link_b = a.id
GROUP BY a.id
LIMIT 0,5", $db);
while ($record = mysql_fetch_array ($select))
{
echo "<p>{$record['testo']}</p>";
echo "<p>(n.commenti $record['num_commenti'])</p>";
}

a.id è l'id dell'articolo

bouncey2k
03-01-2008, 13:41
$select = mysql_query ("SELECT a.*, COUNT(c.id) num_commenti
FROM articoli a
LEFT JOIN commenti c ON c.link_b = a.id
GROUP BY a.id
LIMIT 0,5", $db);
while ($record = mysql_fetch_array ($select))
{
echo "<p>{$record['testo']}</p>";
echo "<p>(n.commenti $record['num_commenti'])</p>";
}

a.id è l'id dell'articolo

Che cosa stanno a significare quei "a" e "c"? E quel "FROM articoli a" ?

kk3z
03-01-2008, 15:04
a, c e num_commenti sono alias, cioè un altro modo di identificare una tabella (articoli -> a, commenti -> c) o un campo (COUNT(commenti.id) -> num_commenti). Se non ti è chiaro, ecco altre 2 soluzioni identiche:
SELECT a.*, COUNT(c.id) AS num_commenti
FROM articoli AS a
LEFT JOIN commenti AS c ON c.link_b = a.id
GROUP BY articoli.id
LIMIT 0,5

SELECT articoli.*, COUNT(commenti.id)
FROM articoli
LEFT JOIN commenti ON commenti.link_b = articoli.id
GROUP BY articoli.id
LIMIT 0,5

bouncey2k
03-01-2008, 16:32
adesso funziona, però GROUP BY articoli.id me li ordina in maniere crescente, io vorrei che me li ordinasse in maniera decrescente.

Ho provato con un ORDER BY articoli.id DESC ma non funziona, addirittura spariscono gli articoli!

kk3z
03-01-2008, 17:19
Sicuramente metti l'ORDER BY nel posto sbagliato, e poi non controlli se la query dà errore o no. L'ORDER BY va dopo il GROUP BY e prima del LIMIT:
SELECT a.*, COUNT(c.id) num_commenti
FROM articoli a
LEFT JOIN commenti c ON c.link_b = a.id
GROUP BY a.id
ORDER BY a.id DESC
LIMIT 0,5

bouncey2k
03-01-2008, 17:40
Grazie. Adesso funziona tutto.