English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Nei capitoli precedenti, abbiamo imparato come leggere dati in una tabella, che è relativamente semplice, ma negli applicativi reali spesso è necessario leggere dati da più tabelle.
In questa sezione ti mostreremo come utilizzare JOIN di MySQL per interrogare dati in due o più tabelle.
Puoi usare JOIN di Mysql in SELECT, UPDATE e DELETE per unire query su più tabelle.
JOIN si suddivide in tre categorie principali per funzione:
INNER JOIN (giunzione interna, o giunzione equivalente):Ottiene le record di relazione di campo che corrispondono in entrambe le tabelle.
LEFT JOIN (giunzione sinistra):Ottiene tutte le righe della tabella sinistra, anche se non ci sono corrispondenze nella tabella destra.
RIGHT JOIN (giunzione destra): Contrariamente a LEFT JOIN, utilizzato per ottenere tutte le righe della tabella destra, anche se non ci sono corrispondenze nella tabella sinistra.
Struttura del database utilizzata in questa sezione e download dei dati:w3codebox-mysql-join-test.sql.
Abbiamo due tabelle tcount_tbl e w3codebox_tbl nel database w3codebox. I dati delle tabelle sono i seguenti:
Prova i seguenti esempi:
mysql> use w3codebox; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | 基础教程网 | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 righe nel set (0.01 sec) mysql> SELECT * from w3codebox_tbl; +-----------+---------------+---------------+-----------------+ | w3codebox_id | w3codebox_title | w3codebox_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 学习 PHP | 基础教程网 | 2017-04-12 | | 2 | 学习 MySQL | 基础教程网 | 2017-04-12 | | 3 | 学习 Java | oldtoolbag.com | 2015-05-01 | | 4 | 学习 Python | oldtoolbag.com | 2016-03-06 | | 5 | 学习 C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)
接下来我们就使用MySQL的INNER JOIN(也可以省略INNER使用JOIN,效果一样)用来连接以上两张表来读取w3codebox_tbl表中所有w3codebox_author字段在tcount_tbl表对应的w3codebox_count字段值:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Sito di tutorial di base | 10 | | 2 | Sito di tutorial di base | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)
以上SQL语句等价于:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a, tcount_tbl b WHERE a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Sito di tutorial di base | 10 | | 2 | Sito di tutorial di base | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)
MySQL left join è diverso da join. MySQL LEFT JOIN leggerà tutti i dati della tabella di sinistra, anche se non ci sono dati corrispondenti nella tabella di destra.
Prova il seguente esempio per w3codebox_tbl È per la tabella di sinistra,tcount_tbl È per la tabella di destra, comprendere l'applicazione di MySQL LEFT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a LEFT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Sito di tutorial di base | 10 | | 2 | Sito di tutorial di base | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
Nell'esempio sopra è stato utilizzato LEFT JOIN, la quale leggerà tutti i campi selezionati della tabella di sinistra w3codebox_tbl, anche se non ci sono valori corrispondenti w3codebox_author nella tabella di destra tcount_tbl.
MySQL RIGHT JOIN leggerà tutti i dati della tabella di destra, anche se non ci sono dati corrispondenti nella tabella di sinistra.
Prova il seguente esempio per w3codebox_tbl È per la tabella di sinistra,tcount_tbl È per la tabella di destra, comprendere l'applicazione di MySQL RIGHT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a RIGHT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | Sito di tutorial di base | 10 | | 2 | Sito di tutorial di base | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
Nell'esempio sopra è stato utilizzato RIGHT JOIN, la statement leggerà tutti i campi selezionati del database tcount_tbl, anche se non ci sono valori corrispondenti del campo w3codebox_author nella tabella w3codebox_tbl.
Esegui una query SQL utilizzando la funzione mysqli_query() in PHP, puoi utilizzare la stessa query SQL come parametro della funzione mysqli_query().
Prova il seguente esempio:
<?php $dbhost = 'localhost'; // Indirizzo del server mysql $dbuser = 'root'; // Nome utente mysql $dbpass = '123456'; // Password dell'utente mysql $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if (!$conn) { die('Fallimento della connessione: ' . mysqli_error($conn)); } // Impostare la codifica, per prevenire la disordinazione dei caratteri cinesi mysqli_query($conn, "set names utf8"); $sql = 'SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author'; mysqli_select_db($conn, 'w3codebox'); $retval = mysqli_query($conn, $sql); if(! $retval ) { die('Impossibile leggere i dati: ' . mysqli_error($conn)); } echo '<h2>Manuale di base MySQL JOIN Test<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>Autore</td><td>Accessi</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['w3codebox_id']}</td> ". "<td>{$row['w3codebox_author']} </td> ". "<td>{$row['w3codebox_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
Il risultato dell'output è come illustrato di seguito: