MySQLi - Usando Joins
Até agora, só obtemos dados de uma tabela por vez. Isso é bom para tomadas simples, mas na maioria dos usos do MySQL no mundo real, você frequentemente precisará obter dados de várias tabelas em uma única consulta.
Você pode usar várias tabelas em sua única consulta SQL. O ato de ingressar no MySQLi refere-se a quebrar duas ou mais tabelas em uma única tabela.
Você pode usar JOINS nas instruções SELECT, UPDATE e DELETE para juntar as tabelas do MySQLi. Veremos um exemplo de LEFT JOIN também, que é diferente do simples MySQLi JOIN.
Usando associações no prompt de comando
Suponha que temos duas tabelas tutorials_bks e tutorials_inf, em TUTORIAIS. Uma lista completa é fornecida abaixo -
Exemplo
Experimente os seguintes exemplos -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_bks;
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
+----+---------+
5 rows in set (0.00 sec)
mysql> SELECT * from tutorials_inf;
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 2 | johar |
| 3 | raghu |
| 4 | ram |
+----+-------+
4 rows in set (0.00 sec)
mysql>
Agora podemos escrever uma consulta SQL para unir essas duas tabelas. Esta consulta irá selecionar todos os nomes da tabelatutorials_inf e obterá o número correspondente de tutoriais detutorials_bks.
mysql> SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id;
+----+-------+----+
| id | name | id |
+----+-------+----+
| 1 | sai | 1 |
| 2 | johar | 2 |
| 3 | raghu | 3 |
| 4 | ram | 4 |
+----+-------+----+
4 rows in set (0.00 sec)
mysql>
Na tabela tutorials_bks, temos 5 registros, mas no exemplo acima ele filtra e fornece apenas 4 registros de id conforme a consulta
Usando Joins em PHP Script
Você pode usar qualquer uma das consultas SQL mencionadas acima no script PHP. Você só precisa passar a consulta SQL para a função PHPmysqli_query() e então você buscará os resultados da maneira usual.
Exemplo
Experimente o seguinte exemplo -
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root';
$dbpass = '';
$dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully</br>';
$sql = 'SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id';
if($result = mysqli_query($conn, $sql)) {
if(mysqli_num_rows($result) > 0) {
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>name</th>";
echo "<th>id</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>";
echo "<td>" . $row['id'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result);
} else {
echo "No records matching your query were found.";
}
} else {
echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn);
}
mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
id name id
1 sai 1
2 johar 2
3 raghu 3
4 ram 4
MySQL LEFT JOIN
Uma junção à esquerda do MySQLi é diferente de uma junção simples. Um MySQLi LEFT JOIN dá consideração extra à tabela que está à esquerda.
Se eu fizer um LEFT JOIN, obtenho todos os registros que correspondem da mesma maneira e, ALÉM DISSO, obtenho um registro extra para cada registro não correspondido na tabela à esquerda do join - garantindo assim (no meu exemplo) que cada nome receba um menção -
Exemplo
Experimente o seguinte exemplo para entender LEFT JOIN -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql>SELECT a.id, a.name,b.id FROM tutorials_inf a LEFT JOIN tutorials_bks b ON a.id = b.id;
Você precisaria praticar mais para se familiarizar com JOINS. Este é um conceito um pouco complexo no MySQL / SQL e ficará mais claro ao fazer exemplos reais.