English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Nos capítulos anteriores, já aprendemos como ler dados em uma tabela, isso é relativamente simples, mas na verdade, na aplicação real, frequentemente é necessário ler dados de várias tabelas de dados.
Neste capítulo, vamos mostrar como usar JOIN do MySQL para consultar dados em duas ou mais tabelas.
Você pode usar JOIN do Mysql no SELECT, UPDATE e DELETE para unir consultas de múltiplas tabelas.
A JOIN é dividida大致 em três tipos de funções:
INNER JOIN (conexão interna, ou conexão equivalente)Obter os registros de relação de campo correspondente entre as duas tabelas.
LEFT JOIN (conexão esquerda):Obter todos os registros da tabela esquerda, mesmo que a tabela direita não tenha registros correspondentes.
RIGHT JOIN (conexão direita): Ao contrário do LEFT JOIN, usado para obter todos os registros da tabela direita, mesmo que a tabela esquerda não tenha registros correspondentes.
A estrutura do banco de dados usada neste capítulo e o download dos dados:w3codebox-mysql-join-test.sql.
Nós estamos no w3No banco de dados codebox há duas tabelas tcount_tbl e w3codebox_tbl. Os dados das duas tabelas são os seguintes:
Tente o seguinte exemplo:
mysql> use w3codebox; Banco de dados alterado mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | Guia Básico | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 linhas em conjunto (0.01 sec) mysql> SELECT * from w3codebox_tbl; +-----------+---------------+---------------+-----------------+ | w3codebox_id | w3codebox_title | w3codebox_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | Aprenda PHP | Guia Básico | 2017-04-12 | | 2 | Aprenda MySQL | Guia Básico | 2017-04-12 | | 3 | Aprenda Java | oldtoolbag.com | 2015-05-01 | | 4 | Aprenda Python | oldtoolbag.com | 2016-03-06 | | 5 | Aprenda C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 linhas em conjunto (0.01 sec)
A seguir, usaremos o MySQLINNER JOIN (também pode omitir INNER usando JOIN, o efeito é o mesmo)Para conectar essas duas tabelas e ler w3Todos os w na tabela codebox_tbl3O campo codebox_author na tabela tcount_tbl tem o correspondente w3Valor do campo codebox_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 | Site de tutoriais básicos | 10 | | 2 | Site de tutoriais básicos | 10 | | 3 | oldtoolbag.com | 20 | NULL | | 4 | oldtoolbag.com | 20 | NULL | +-------------+-----------------+----------------+ 4 linhas no conjunto (0.00 seg)
A seguinte consulta SQL é equivalente a:
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 | Site de tutoriais básicos | 10 | | 2 | Site de tutoriais básicos | 10 | | 3 | oldtoolbag.com | 20 | NULL | | 4 | oldtoolbag.com | 20 | NULL | +-------------+-----------------+----------------+ 4 linhas em conjunto (0.01 sec)
O MySQL left join é diferente do join. O MySQL LEFT JOIN lê todos os dados da tabela da esquerda, mesmo que a tabela da direita não tenha dados correspondentes.
Tente o seguinte exemplo para w3codebox_tbl Para a tabela da esquerda,tcount_tbl Para a tabela da direita, compreenda a aplicação do 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 | Site de tutoriais básicos | 10 | | 2 | Site de tutoriais básicos | 10 | | 3 | oldtoolbag.com | 20 | NULL | | 4 | oldtoolbag.com | 20 | NULL | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 linhas em conjunto (0.01 sec)
No exemplo acima, foi usado LEFT JOIN, que lê a tabela de dados da esquerda w3todos os campos selecionados de codebox_tbl, mesmo que não haja correspondência para w na tabela tcount_tbl da direita3Valor do campo codebox_author.
O MySQL RIGHT JOIN lê todos os dados da tabela da direita, mesmo que a tabela da esquerda não tenha dados correspondentes.
Tente o seguinte exemplo para w3codebox_tbl Para a tabela da esquerda,tcount_tbl Para a tabela da direita, compreenda a aplicação do RIGHT JOIN no MySQL:
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 | Site de tutoriais básicos | 10 | | 2 | Site de tutoriais básicos | 10 | | 3 | oldtoolbag.com | 20 | NULL | | 4 | oldtoolbag.com | 20 | NULL | | NULL | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 linhas em conjunto (0.01 sec)
No exemplo acima, foi usado RIGHT JOIN, a instrução lê todos os campos selecionados da tabela tcount_tbl da direita, mesmo que não haja correspondência na tabela esquerda w3Não há correspondência do campo w em codebox_tbl3Valor do campo codebox_author.
No PHP, use a função mysqli_query() para executar a instrução SQL, você pode usar a mesma instrução SQL como parâmetro da função mysqli_query().
Tente o seguinte exemplo:
<?php $dbhost = 'localhost'; // Endereço do servidor do MySQL $dbuser = 'root'; // Nome de usuário do MySQL $dbpass = '123456'; // Nome de usuário e senha do MySQL $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn) { die('Falha na conexão: ' . mysqli_error($conn)); } // Definir codificação, evitar a confusão de caracteres chineses 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, 'w' )}}3codebox' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('Não foi possível ler os dados: ' . mysqli_error($conn)); } echo '<h2>Site de Tutorial Básico MySQL JOIN Teste<h2> echo '<table border="1><tr><td> ID do Tutorial</td><td> Autor</td><td>Qtde de Acessos</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); ?>
O resultado de saída é mostrado na figura a seguir: