Cikkkönyvtár
Hogyan használható a belső illesztés több táblával egy MySQL adatbázisban ? Mi a bal oldali illesztés hatékonysága?
Mysql kapcsolat használata
Az előző fejezetekben megtanultuk, hogyan lehet egy táblából kiolvasni az adatokat, ami viszonylag egyszerű, de valós alkalmazásokban sokszor több adattáblából kell kiolvasni az adatokat.
Ebben a fejezetben bemutatjuk, hogyan használhatja a MySQL JOIN funkcióját két vagy több tábla adatainak lekérdezésére.
A Mysql JOIN parancsát használhatja a SELECT, UPDATE és DELETE utasításokban a többtáblás lekérdezések összekapcsolásához.
A JOIN funkciója szerint nagyjából a következő három kategóriába sorolható:
- BELSŐ ÖSSZEFÜGGÉS (belső összekapcsolás vagy equijoin): Rekordok lekérése egyező mezőkkel két táblázatban.
- LEFT JOIN (bal csatlakozás):A bal oldali táblázat összes rekordját lekéri, még akkor is, ha a jobb oldali táblázatban nincs egyező rekord.
- JOBB CSATLAKOZÁS (jobb csatlakozás): Ellentétben a LEFT JOIN-nel, ez arra szolgál, hogy az összes rekordot a jobb oldali táblában kapja meg, még akkor is, ha a bal oldali táblában nincsenek megfelelő rekordok.
Az INNER JOIN használata a parancssorban
Két tcount_tbl és chenweiliang_tbl táblánk van a chenweiliang adatbázisban.A két adattábla adatai a következők:
Példa
Próbálja ki a következő példákat:
tesztpéldány adatok
mysql> use chenweiliang; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | chenweiliang_author | chenweiliang_count | +---------------+--------------+ | 陈沩亮博客 | 10 | | chenweiliang.com | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SELECT * from chenweiliang_tbl; +-----------+---------------+---------------+-----------------+ | chenweiliang_id | chenweiliang_title | chenweiliang_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 学习 PHP | 陈沩亮博客 | 2017-04-12 | | 2 | 学习 MySQL | 陈沩亮博客 | 2017-04-12 | | 3 | 学习 Java | chenweiliang.com | 2015-05-01 | | 4 | 学习 Python | chenweiliang.com | 2016-03-06 | | 5 | 学习 C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)
Ezután a MySQL INNER JOIN függvénnyel (az INNER függvénnyel el is hagyhatjuk a JOIN függvénnyel való együttműködést, a hatás ugyanaz) összekapcsoljuk a fenti két táblát, és kiolvassuk a chenweiliang_tbl tábla chenweiliang_author mezőjének értékeit, valamint a tcount_tbl tábla megfelelő chenweiliang_count mezőértékeit:
INNER JOIN
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a INNER JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)
A fenti SQL utasítás megegyezik a következővel:
WHERE záradék
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a, tcount_tbl b WHERE a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)
A MySQL LEFT CSATLAKOZÁS
A MySQL bal oldali csatlakozása eltér a csatlakozástól. A MySQL LEFT JOIN beolvassa a bal oldali adattáblázat összes adatát, még akkor is, ha a jobb oldali táblában nincsenek megfelelő adatok.
Példa
A MySQL LEFT JOIN alkalmazásának megértéséhez próbálja ki a következő példát, amelyben a chenweiliang_tbl a bal oldali , a tcount_tbl pedig a jobb oldali tábla:
BAL EGYSZER
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a LEFT JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
A fenti példában a LEFT JOIN-t használjuk, amely a bal oldali chenweiliang_tbl adattábla összes kiválasztott mezőadatát beolvassa, még akkor is, ha a jobb oldali tcount_tbl táblában nincs megfelelő chenweiliang_author mezőérték.
MySQL RIGHT CSATLAKOZÁS
A MySQL RIGHT JOIN a jobb oldali adattáblázat összes adatát beolvassa, még akkor is, ha a bal oldali táblázatban nincs megfelelő adat.
Példa
A MySQL RIGHT JOIN alkalmazásának megértéséhez próbálja ki a következő példát, amelyben a chenweiliang_tbl táblát használja bal oldali , a tcount_tbl pedig jobb oldali táblaként:
JOBB CSATLAKOZÁS
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a RIGHT JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
A RIGHT JOIN-t a fenti példában használjuk, ez az utasítás beolvassa a jobb oldali tcount_tbl adattábla összes kiválasztott mezőadatát, még akkor is, ha a bal oldali chenweiliang_tbl táblában nincs megfelelő chenweiliang_author mezőérték.
A JOIN használata PHP szkriptben
A mysqli_query() függvény a PHP-ben SQL utasítások végrehajtására szolgál, a fenti SQL utasítást használhatja a mysqli_query() függvény paramétereként.
Próbáld ki a következő példát:
MySQL ORDER BY teszt:
<?
php
$dbhost = 'localhost:3306'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = 'SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a INNER JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author';
mysqli_select_db( $conn, 'chenweiliang' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>陈沩亮博客 MySQL JOIN 测试<h2>';
echo '<table border="1"><tr><td>教程 ID</td><td>作者</td><td>登陆次数</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQL_ASSOC))
{
echo "<tr><td> {$row['chenweiliang_id']}</td> ".
"<td>{$row['chenweiliang_author']} </td> ".
"<td>{$row['chenweiliang_count']} </td> ".
"</tr>";
}
echo '</table>';
mysqli_close($conn);
?>Remélhetőleg hasznosnak találod a Chen Weiliang blogján ( https://www.chenweiliang.com/ ) megosztott „MySQL adatbázis belső illesztésének használata több táblán keresztül? A bal oldali illesztés hatékonysága” című cikket .
Nyugodtan oszd meg a cikk linkjét: https://www.chenweiliang.com/cwl-488.html
