MySQLi - 使用联接
在前面的章节中,我们一次从一个表中获取数据。 这对于简单的任务来说已经足够了,但在大多数现实世界的 MySQL 使用中,您经常需要在单个查询中从多个表中获取数据。
您可以在单个 SQL 查询中使用多个表。 MySQL中的连接行为是指将两个或多个表粉碎成一个表。
您可以在 SELECT、UPDATE 和 DELETE 语句中使用 JOINS 来连接 MySQL 表。 我们还将看到一个 LEFT JOIN 的示例,它与简单的 MySQL JOIN 不同。
在命令提示符下使用联接
假设我们在 TUTORIALS 中有两个表 tcount_tbl 和 tutorials_tbl。 现在看一下下面给出的示例 −
示例
下面的例子 −
root@host# 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>
现在我们可以编写一个 SQL 查询来连接这两个表。 此查询将从表 tutorials_tbl 中选择所有作者,并从 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>
在 PHP 脚本中使用联接
PHP 使用 mysqli query() 或 mysql_query() 函数通过连接从 MySQL 表中获取记录。 该函数采用两个参数,成功时返回 TRUE,失败时返回 FALSE。
语法
$mysqli→query($sql,$resultmode)
Sr.No. | 参数及说明 |
---|---|
1 |
$sql 必需 - 使用 Join 从多个表中获取记录的 SQL 查询。 |
2 |
$resultmode 可选 - 常量 MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT,具体取决于所需的行为。 默认情况下,使用 MYSQLI_STORE_RESULT。 |
首先使用以下脚本在 MySQL 中创建一个表并插入两条记录。
create table tcount_tbl( tutorial_author VARCHAR(40) NOT NULL, tutorial_count int ); insert into tcount_tbl values('Mahesh', 3); insert into tcount_tbl values('Suresh', 1);
示例
尝试以下示例以使用 Join 从两个表中获取记录。−
将以下示例复制并粘贴为 mysql_example.php −
<html> <head> <title>Using joins on MySQL Tables</title> </head> <body> <?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'root@123'; $dbname = 'TUTORIALS'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if($mysqli→connect_errno ) { printf("Connect failed: %s<br />", $mysqli→connect_error); exit(); } printf('Connected successfully.<br />'); $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'; $result = $mysqli→query($sql); if ($result→num_rows > 0) { while($row = $result→fetch_assoc()) { printf("Id: %s, Author: %s, Count: %d <br />", $row["tutorial_id"], $row["tutorial_author"], $row["tutorial_count"]); } } else { printf('No record found.<br />'); } mysqli_free_result($result); $mysqli→close(); ?> </body> </html>
输出
访问部署在 apache Web 服务器上的 mysql_example.php 并验证输出。
Connected successfully. Id: 1, Author: Mahesh, Count: 3 Id: 2, Author: Mahesh, Count: 3 Id: 3, Author: Mahesh, Count: 3 Id: 5, Author: Suresh, Count: 1
MySQL LEFT JOIN(左连接)
MySQL 左连接不同于简单连接。 MySQL LEFT JOIN 对左侧的表给予了一些额外的考虑。
如果我执行LEFT JOIN, 我以相同的方式获得了所有匹配的记录,此外,我还为连接的左表中的每个不匹配的记录获得了一条额外的记录:从而确保(在我的示例中)每个作者都得到提及。
示例
尝试以下示例来了解 LEFT JOIN。
root@host# 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)
您需要进行更多练习才能熟悉 JOINS。 这在 MySQL/SQL 中是有点复杂的概念,在实际示例中会变得更加清晰。