Usando junções MySQl

Nos capítulos anteriores, estávamos obtendo dados de uma tabela por vez. Isso é bom o suficiente 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 MySQL se refere 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 MySQL. Veremos também um exemplo de LEFT JOIN, que é diferente do simples MySQL JOIN.

Usando associações no prompt de comando

Suponha que temos duas tabelas tcount_tbl e tutorials_tbl, em TUTORIAIS. Agora dê uma olhada nos exemplos fornecidos abaixo -

Exemplo

Os exemplos a seguir -

[email protected]# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|      mahran     |       20       |     
|      mahnaz     |      NULL      |        
|       Jen       |      NULL      |          
|      Gill       |       20       |          
|    John Poul    |        1       |      
|     Sanjay      |        1       |        
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|      1      |  Learn PHP     |     John Poul   |    2007-05-24   |   
|      2      |  Learn MySQL   |      Abdul S    |    2007-05-24   |   
|      3      | JAVA Tutorial  |      Sanjay     |    2007-05-06   |   
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>

Agora podemos escrever uma consulta SQL para unir essas duas tabelas. Esta consulta irá selecionar todos os autores da tabelatutorials_tbl e pegará o número correspondente de tutoriais do tcount_tbl.

mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
   -> FROM tutorials_tbl a, tcount_tbl b
   -> WHERE a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
|      1      |    John Poul    |        1       |
|      3      |     Sanjay      |        1       |
+-------------+-----------------+----------------+
2 rows in set (0.01 sec)
mysql>

Usando Joins em um Script PHP

Você pode usar qualquer uma das consultas SQL mencionadas acima no script PHP. Você só precisa passar a consulta SQL para a função PHPmysql_query() e, em seguida, você buscará os resultados da maneira usual.

Exemplo

O exemplo a seguir -

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
      FROM tutorials_tbl a, tcount_tbl b
      WHERE a.tutorial_author = b.tutorial_author';

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Author:{$row['tutorial_author']}  <br> ".
         "Count: {$row['tutorial_count']} <br> ".
         "Tutorial ID: {$row['tutorial_id']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

MySQL LEFT JOIN

Uma junção à esquerda do MySQL é diferente de uma junção simples. Um MySQL LEFT JOIN dá alguma 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 da junção: garantindo assim (no meu exemplo) que cada AUTOR receba uma menção.

Exemplo

Experimente o seguinte exemplo para entender o LEFT JOIN.

[email protected]# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
   -> FROM tutorials_tbl a LEFT JOIN tcount_tbl b
   -> ON a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
|      1      |    John Poul    |       1        |
|      2      |     Abdul S     |      NULL      |
|      3      |     Sanjay      |       1        |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)

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.