English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Utilizzo connessione MySQL

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.

Utilizzo di INNER JOIN nel prompt dei comandi

Abbiamo due tabelle tcount_tbl e w3codebox_tbl nel database w3codebox. I dati delle tabelle sono i seguenti:

Esempio online

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

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.

Esempio online

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

MySQL RIGHT JOIN leggerà tutti i dati della tabella di destra, anche se non ci sono dati corrispondenti nella tabella di sinistra.

Esempio online

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.

Utilizzo di JOIN in uno script PHP

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: