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.