নিবন্ধ ডিরেক্টরি
MySQL ডাটাবেসে একাধিক টেবিলের সাথে ইনার জয়েন কীভাবে ব্যবহার করতে হয় ? লেফট জয়েনের কার্যকারিতা কী?
মাইএসকিউএল সংযোগ ব্যবহার
পূর্ববর্তী অধ্যায়গুলিতে, আমরা শিখেছি কিভাবে একটি টেবিল থেকে ডেটা পড়তে হয়, যা তুলনামূলকভাবে সহজ, কিন্তু বাস্তব অ্যাপ্লিকেশনগুলিতে এটি প্রায়ই একাধিক ডেটা টেবিল থেকে ডেটা পড়তে হয়।
এই অধ্যায়ে আমরা আপনাকে দেখাব কিভাবে MySQL এর JOIN ব্যবহার করে দুই বা ততোধিক টেবিলে ডেটা জিজ্ঞাসা করতে হয়।
আপনি মাল্টি-টেবিল প্রশ্নে যোগ দিতে SELECT, UPDATE এবং DELETE স্টেটমেন্টে Mysql-এর JOIN ব্যবহার করতে পারেন।
JOIN এর কার্য অনুসারে মোটামুটিভাবে নিম্নলিখিত তিনটি বিভাগে বিভক্ত:
- অভ্যন্তরীণ যোগদান (অভ্যন্তরীণ যোগদান, বা সমকক্ষ): দুটি টেবিলে মিলে যাওয়া ক্ষেত্রগুলির সাথে রেকর্ডগুলি পান৷
- বাম যোগদান (বাম যোগদান):বাম টেবিলে সব রেকর্ড পান, এমনকি ডান টেবিলে কোনো মিলে যাওয়া রেকর্ড না থাকলেও।
- ডান যোগদান (ডান যোগদান): বাম যোগদানের বিপরীতে, এটি ডান সারণীতে সমস্ত রেকর্ড পেতে ব্যবহার করা হয়, এমনকি যদি বাম সারণীতে কোনো সংশ্লিষ্ট মিলে যাওয়া রেকর্ড না থাকে।
কমান্ড প্রম্পটে INNER JOIN ব্যবহার করে
chenweiliang ডাটাবেসে আমাদের tcount_tbl এবং chenweiliang_tbl দুটি টেবিল আছে।দুটি ডেটা টেবিলের ডেটা নিম্নরূপ:
দৃষ্টান্ত
নিম্নলিখিত উদাহরণ চেষ্টা করুন:
পরীক্ষার উদাহরণ ডেটা
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)
এরপরে, আমরা উপরের দুটি টেবিলকে যুক্ত করতে MySQL-এর INNER JOIN ব্যবহার করব (আপনি INNER বাদ দিয়ে JOIN ব্যবহার করতে পারেন, ফলাফল একই হবে) এবং chenweiliang_tbl টেবিলের chenweiliang_author ফিল্ডের মান ও tcount_tbl টেবিলের সংশ্লিষ্ট chenweiliang_count ফিল্ডের মানগুলো পড়ব:
ভেতরের যোগ দিতে
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)
উপরের এসকিউএল বিবৃতিটি এর সমতুল্য:
WHERE ধারা
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)
MySQL বাম যোগদান
মাইএসকিউএল বাম যোগ যোগদান থেকে আলাদা। MySQL LEFT JOIN বাম ডাটা টেবিলের সমস্ত ডেটা পড়বে, এমনকি ডান টেবিলে কোনো সংশ্লিষ্ট ডেটা না থাকলেও।
দৃষ্টান্ত
MySQL LEFT JOIN-এর প্রয়োগ বোঝার জন্য, বাম টেবিল হিসেবে chenweiliang_tbl এবং ডান টেবিল হিসেবে tcount_tbl ব্যবহার করে নিম্নলিখিত উদাহরণটি চেষ্টা করুন :
বাম যোগ দিন
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)
উপরের উদাহরণে, LEFT JOIN ব্যবহার করা হয়েছে, এবং এই বিবৃতিটি বাম দিকে chenweiliang_tbl-এর সমস্ত নির্বাচিত ফিল্ড ডেটা পড়বে, এমনকি ডানদিকে tcount_tbl টেবিলে chenweiliang_author-এর কোনো সংশ্লিষ্ট ফিল্ড মান না থাকলেও।
মাইএসকিউএল ডান যোগদান
MySQL RIGHT JOIN ডানদিকের ডাটা টেবিলের সমস্ত ডেটা পড়বে, এমনকি বাম দিকের টেবিলে কোনো সংশ্লিষ্ট ডেটা না থাকলেও।
দৃষ্টান্ত
MySQL RIGHT JOIN-এর প্রয়োগ বোঝার জন্য, বাম টেবিল হিসেবে chenweiliang_tbl এবং ডান টেবিল হিসেবে tcount_tbl ব্যবহার করে নিম্নলিখিত উদাহরণটি চেষ্টা করুন :
ডান যোগদান
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)
উপরের উদাহরণে RIGHT JOIN ব্যবহার করা হয়েছে, এই বিবৃতিটি ডান ডেটা টেবিল tcount_tbl-এর সমস্ত নির্বাচিত ফিল্ড ডেটা পড়বে, এমনকি বাম টেবিলে chenweiliang_author ক্ষেত্রের মান না থাকলেও৷
PHP স্ক্রিপ্টে JOIN ব্যবহার করে
mysqli_query() ফাংশনটি পিএইচপি-তে SQL স্টেটমেন্ট চালানোর জন্য ব্যবহার করা হয়, আপনি mysqli_query() ফাংশনের প্যারামিটার হিসাবে উপরের মত একই SQL স্টেটমেন্ট ব্যবহার করতে পারেন।
নিম্নলিখিত উদাহরণ চেষ্টা করুন:
পরীক্ষা দ্বারা MySQL ক্রম:
<?
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);
?>আশা করি, চেন ওয়েইলিয়াং-এর ব্লগে ( https://www.chenweiliang.com/ ) শেয়ার করা "Using MySQL Database inner join across multiple tables? Efficiency of left join" শীর্ষক প্রবন্ধটি আপনার জন্য সহায়ক হবে।
এই নিবন্ধটির লিঙ্কটি নির্দ্বিধায় শেয়ার করুন: https://www.chenweiliang.com/cwl-488.html
