Mysql - left join

  • Creatore Discussione Creatore Discussione huck
  • Data di inizio Data di inizio

huck

Nuovo Utente
7 Ott 2004
11
0
0
Salve a tutti, spiego in sintesi il problema:

tabella 1 "utente"
------------
IDUtente
Nome
RIDRegione


tabella 2 "regione"
------------
IDRgione
Regione


Ho utilizzato la seguente query:

SELECT r.Regione, count( u.RIDRegione ) AS totale
FROM utente AS u LEFT JOIN regione AS r ON u.RIDRegione = r.IDRegione
WHERE u.IDUtente >1
GROUP BY `RIDRegione`
ORDER BY totale DESC


Vorrei visualizzare tutte le regioni, con accanto il numero totale di relativi iscritti. Sono riuscito a visualizzare solo le regioni che hanno occorrenza nella tabella "utente", ma non riesco a visualizzare le restanti regioni con accanto 0 come risultato.
Potete aiutarmi?

Grazie in anticipo
 
ciao
sarà perchè non amo molto le join (ne implicite ne esplicite) in quanto quasi sempre mi incasino.
ti do un suggerimento (sensa join)

PHP:
<?php
//............
$query_1="SELECT * FROM regione ORDER BY Regione";//query sulle regioni
$result_1=mysql_query($query_1);
while($regione=mysql_fetch_array($result_1)){
	$id_r=$regione['IDRegione'];
	$no_r=$regione['Regione'];
	$query_2="SELECT IDUtente FROM utente WHERE IDUtente='".$id_r."'";//query sugli utenti
	$numero=mysql_num_rows($query_2);//numero di utenti, 0 se non esistono
	/*se metti tutto in un array con chiave= no_r e valore= numero poi con sort()...
	puoi ordinare la visualizzazione come vuoi */
	echo "nella regione: $no_r ho $numero utenti<br>";
}//fine while
//ecc......
?>
 
Grazie della tua attenzione.
In realtà mi ero impuntanto di imparare una volta per tutte ad utilizzare di più le query; inoltre, non avevo menzionato l'esigenza di visualizzare le regioni in ordine di registrazioni.

Es.
Piemonte 50
Lombardia 34
Sicilia 12
......
.......
 
ciao
guarda che lo script fa proprio quello

Piemonte 50
Lombardia 34
Sicilia 12
......
.......
cioè scrive il numero della regione e vicino il numero di iscritti della regione, io intendevo l'ordinamento per ordine alfabetico per nome regione (chiave con ksort) o per numero di iscritti (value con sort)
 
scusa ho avuto dei problemi prima di finire di scrivere, questo è quello che intendevo
PHP:
<?php 
//............ 
$query_1="SELECT * FROM regione ORDER BY Regione";//query sulle regioni 
$result_1=mysql_query($query_1); 
while($regione=mysql_fetch_array($result_1)){ 
    $id_r=$regione['IDRegione']; 
    $no_r=$regione['Regione']; 
    $query_2="SELECT IDUtente FROM utente WHERE IDUtente='".$id_r."'";//query sugli utenti 
    $numero=mysql_num_rows($query_2);//numero di utenti, 0 se non esistono 
    /*metti tutto in un array con chiave= no_r e valore= numero poi con sort()... 
    puoi ordinare la visualizzazione come vuoi */ 
    $visualizza[$no_r]=$numero;
}//fine while 
//ordine crescente per valore (per decrescente arsort())
$visualizza=asort($visualizza);
/*
ordine crescente per chiave ksort() (decrescente krsort())
$visualizza=ksort($visualizza);
*/
//stampa
foreach($visualizza as $regione => $iscritti){
	echo "$regione  $iscritti<br>";
}

//ecc...... 
?>
l'ordinamento per valore ti da

Veneto 55
Piemonte 50
Lombardia 34
Sicilia 12
......
.......
Abruzzo 0
quello per chiave
Abruzzo 0
...........
Lombardia 34
Piemonte 50
........
Sicilia 12
......
Veneto 55
 
Ultima modifica:
grazie, hai ragione, alla fine farò così, ma mi rimarrà sempre il solito dubbio: era più veloce far tutto con una query o fare così?

Ciao e grazie
 
ciao
per vedere (una volta fatta la join) non ti resta che provare


PHP:
$start=microtime();//millisecondi

//le query di un tipo e poi lo stesso con l'altro tipo

$end=microtime();

$tempo_esecuzione=$end-$start;
 
ciao
per vedere (una volta fatta la join) non ti resta che provare


PHP:
$start=microtime();//millisecondi

//le query di un tipo e poi lo stesso con l'altro tipo

$end=microtime();

$tempo_esecuzione=$end-$start;


A posto, la query giusta è questa:

SELECT r.Regione AS reg, count( u.RIDRegione ) AS totale
FROM utente AS u
RIGHT JOIN regione AS r ON u.RIDRegione = r.IDRegione
WHERE r.Regione != 'Non definita'
GROUP BY `Regione`
ORDER BY totale DESC

Grazie del tuo aiuto, proverò comunque a testare i tempi, ma credo che la cosa migliore sia usare direttamente mysql.
Grazie ancora
 

Discussioni simili