PHP MySQL

MySQL JOIN 子句用于根据两个或多个表之间的公共列来组合两个或多个表的行。 MySQL 中有四种类型的 JOIN:

  • INNER JOIN - 有时称为简单 JOIN。它根据两个表中的匹配行返回记录。
  • LEFT JOIN - 有时称为 LEFT OUTER JOIN。它返回包含左表中所有行和右表中匹配行的记录。
  • RIGHT JOIN - 有时称为 RIGHT OUTER JOIN。它返回包含右表中所有行和左表中匹配行的记录。
  • CROSS JOIN - 返回包含两个表中所有行的记录。它有时被称为 CARTESIAN JOIN,因为在没有 WHERE 条件的情况下,它的行为类似于 CARTESIAN Product,即结果集中的行数是两个表的行数的乘积。
PHP 使用 MySQL Join 语句

考虑一个包含名为 employee的员工表的 和 Contact_Info 表包含以下记录:

表 1:Employee 表

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York242750
3JoParis272800
4KimAmsterdam303100
5RameshNew Delhi283000
6HuangBeijing282800

表 2:Contact_Info 表

Phone_NumberEmpIDAddressGender
+1-80540980002Brooklyn, New York, USAF
+33-1479961013Grenelle, Paris, FranceM
+31-2011503194Geuzenveld, Amsterdam, NetherlandsF
+86-10997324586Yizhuangzhen, Beijing, ChinaM
+65-672348247Yishun, SingaporeM
+81-3577990728Koto City, Tokyo, JapanM

在下面的查询中,INNER JOIN 子句与基于公共列 Employee 和 Contact_Info 表一起使用EmpID字段。它根据两个表中找到的匹配项返回姓名、年龄和地址列。

SELECT Employee.Name, Employee.Age, Contact_Info.Address 
FROM Employee
INNER JOIN Contact_Info
ON Employee.EmpID = Contact_Info.EmpID; 

这将产生如下所示的结果:

请注意,要连接到 MySQL 服务器,可以使用 mysqli_connect() 函数。建立连接后,可以使用 mysqli_query() 函数对数据库执行查询。

num_rows() 函数可用于检查返回的行数是否超过零。然后,可以使用 fetch_assoc() 函数以关联数组的形式获取结果集。稍后可以使用 free_result() 函数释放与结果关联的内存。

MySQL JOIN - 面向对象风格

下面的示例演示了如何执行讨论的 INNER JOIN以上使用面向对象的风格。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDatabase";

//建立连接
$mysqli = new mysqli($servername, $username, $password, $dbname);

//检查连接
if ($mysqli->connect_errno) {
  echo "Failed to connect to MySQL: ". $mysqli->connect_error;
  exit();
}

//从数据库获取查询结果
$sql = 'SELECT Employee.Name, Employee.Age, Contact_Info.Address 
FROM Employee
INNER JOIN Contact_Info
ON Employee.EmpID = Contact_Info.EmpID;';

$result = $mysqli->query($sql);

//获取关联数组
while ($row = $result->fetch_assoc()) {
  printf("Name: %s, Age: %d, Address: %s\n", 
          $row["Name"], $row["Age"], $row["Address"]);
}

//释放结果集
$result->free_result();

//关闭连接
$mysqli->close();
?> 

上述代码的输出将是:

Name: Marry, Age: 24, Address: Brooklyn, New York, USA
Name: Jo, Age: 27, Address: Grenelle, Paris, France
Name: Kim, Age: 30, Address: Geuzenveld, Amsterdam, Netherlands
Name: Huang, Age: 28, Address: Yizhuangzhen, Beijing, China 

MySQL JOIN - 面向过程风格

使用以下方法获得相同的结果:面向过程风格,可以使用以下脚本。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDatabase";

//建立连接
$mysqli = mysqli_connect($servername, $username, $password, $dbname);

//检查连接
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: ". mysqli_connect_error();
  exit();
}

//从数据库获取查询结果
$sql = 'SELECT Employee.Name, Employee.Age, Contact_Info.Address 
FROM Employee
INNER JOIN Contact_Info
ON Employee.EmpID = Contact_Info.EmpID;';
$result = mysqli_query($mysqli, $sql);

//获取关联数组
while ($row = mysqli_fetch_assoc($result)) {
  printf("Name: %s, Age: %d, Address: %s\n", 
          $row["Name"], $row["Age"], $row["Address"]);
}

//释放结果集
mysqli_free_result($result);

//关闭连接
mysqli_close($mysqli);
?> 

上述代码的输出将是:

Name: Marry, Age: 24, Address: Brooklyn, New York, USA
Name: Jo, Age: 27, Address: Grenelle, Paris, France
Name: Kim, Age: 30, Address: Geuzenveld, Amsterdam, Netherlands
Name: Huang, Age: 28, Address: Yizhuangzhen, Beijing, China 

完整 PHP MySQLi 参考

完整参考PHP MySQLi 扩展的所有属性、方法和函数,请参阅 PHP MySQLi 参考