MySQl使用联接
在前面的章节中,我们一次从一个表中获取数据。这足以满足简单需要,但是在大多数实际的MySQL使用中,你通常需要在单个查询中从多个表中获取数据。
你可以在单个SQL查询中使用多个表。 MySQL中的联接行为是指将两个或多个表联接为一个表。
你可以在SELECT,UPDATE和DELETE语句中使用JOINS来连接MySQL表。我们还将看到LEFT JOIN的示例,它与简单的MySQL JOIN不同。
在命令提示符处使用联接
假设我们有两个表tcount_tbl和newbiego_tbl,在TUTORIALS中。现在看下面的例子:
以下示例:
root@host# mysql -u root -p password; Enter password:******* mysql> use TUTORIALS; Database changed mysql> SELECT * FROM tcount_tbl; +-----------------+----------------+ | newbiego_author | newbiego_count | +-----------------+----------------+ | mahran | 20 | | mahnaz | NULL | | Jen | NULL | | Gill | 20 | | John Poul | 1 | | Sanjay | 1 | +-----------------+----------------+ 6 rows in set (0.01 sec) mysql> SELECT * from newbiego_tbl; +-------------+----------------+-----------------+-----------------+ | newbiego_id | newbiego_title | newbiego_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查询来联接这两个表。该查询将从表中选择所有作者newbiego_tbl并将从中选择相应数量的教程tcount_tbl.
mysql> SELECT a.newbiego_id, a.newbiego_author, b.newbiego_count -> FROM newbiego_tbl a, tcount_tbl b -> WHERE a.newbiego_author = b.newbiego_author; +-------------+-----------------+----------------+ | newbiego_id | newbiego_author | newbiego_count | +-------------+-----------------+----------------+ | 1 | John Poul | 1 | | 3 | Sanjay | 1 | +-------------+-----------------+----------------+ 2 rows in set (0.01 sec) mysql>
在PHP脚本中使用联接
你可以在PHP脚本中使用任何上述SQL查询。你只需要将SQL查询传递到PHP函数中mysql_query()然后你将以通常的方式获取结果。
下面的例子:
<?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.newbiego_id, a.newbiego_author, b.newbiego_count FROM newbiego_tbl a, tcount_tbl b WHERE a.newbiego_author = b.newbiego_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['newbiego_author']} <br> ". "Count: {$row['newbiego_count']} <br> ". "Tutorial ID: {$row['newbiego_id']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn); ?>
MySQL左联接
MySQL左联接不同于简单联接。 MySQL LEFT JOIN对左侧的表进行了一些额外的考虑。
如果我做一个左联接,我得到了所有以相同方式匹配的记录,此外,在联接的左表中,我为每个不匹配的记录获得了一条额外的记录:从而确保(在我的示例中)每个作者都被提及。
请尝试以下示例以了解LEFT JOIN。
root@host# mysql -u root -p password; Enter password:******* mysql> use TUTORIALS; Database changed mysql> SELECT a.newbiego_id, a.newbiego_author, b.newbiego_count -> FROM newbiego_tbl a LEFT JOIN tcount_tbl b -> ON a.newbiego_author = b.newbiego_author; +-------------+-----------------+----------------+ | newbiego_id | newbiego_author | newbiego_count | +-------------+-----------------+----------------+ | 1 | John Poul | 1 | | 2 | Abdul S | NULL | | 3 | Sanjay | 1 | +-------------+-----------------+----------------+ 3 rows in set (0.02 sec)
你需要做更多的练习才能熟悉JOINS。这在MySQL / SQL中有点复杂的概念,并且在做实际示例时会变得更加清晰。