Trong các ví dụ trên ta chỉ lấy dữ liệu từ một table, nhưng trong thực tế yêu cầu kết xuất dữ liệu đòi hỏi chúng ta phải lấy (tổng hợp) dữ liệu từ nhiều table khác nhau, các table này có thể, hoặc không, được thiết lập quan hệ dữ liệu trước đó. Trong trường hợp này ta vẫn sử dụng câu lệnh Select như thông thường, nhưng lưu ý đến sự kết nối (join) dữ liệu giữa hai table.
Các ví dụ sau được thực hiện dựa trên cơ sở dữ liệu HSCB, gồm 2 table:
Lylich(MaCB, HoTen, MaPB, NgaySinh, HSLuong, NgayHĐ)
ThuNhap(MaCB, NgayThang, NguonThuNhap, SoTien, Thue)
Hai table này:
- Hoặc có ràng buộc (quan hệ) 1 – n với nhau thông qua trường khóa MaCB. Tức là, một cán bộ có mã xác định nào đó ở table lylich (MaCB là khóa chính) thì có thể xuất hiện ở nhiều record khác nhau ở table ThuNhap (MaCB là khóa ngoại).
- Hặc không có ràng buộc (quan hệ) với nhau, nhưng dữ liệu tại các cột MaCB của hai bảng có thể khớp với nhau.
Kết xuất dữ liệu (join 2 table) tại dấu nhắc mysql>
Ví dụ:
root@ubuntu# mysql -u root -p password;
Enter password:*******
mysql>use HSCB;
Database changed
mysql> SELECT * FROM lylich;
…
mysql> SELECT * FROM thunhap;
…
mysql>
Hai lệnh Select trên chỉ in ra các record của từng table. Câu lệnh Select sau sẽ join hai table lylich và thunhap với nhau, nhờ đó mà ta có thể in ra tất cả cán bộ trong table lylich mà có xuất hiện trong table thunhap. Và có thể in ra tổng thu nhập của tất cả cán bộ ở table lylich.
mysql> SELECT a.MaCB, a.TenCB, b.SoTien
-> FROM lylich a, thunhap b WHERE a.MaCB = b.MaCB;
…
mysql>
Trong câu lệnh này, chúng ta cần chú ý các alias a (lylich a), b (thunhap b): Phải đặt alias cho 2 table cần join thì mới sử dụng nó trong biểu thức logic sau Where được.
Kết xuất dữ liệu (join 2 table) tong script PHP
Thực hiện tương tự như trong các dạng lệnh khác của câu lệnh Select. Chỉ khác ở chỗ phải đặt alias (a, b,…) cho các table mà lệnh tác động đến. Chúng ta cần chú ý đến biểu thức logic sau Where: Trên trường phải đi kèm alias để xác định nó thuộc table nào (cả 2 điều có trường MaCB).
Ví dụ:
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'a123456789z';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
If (!$conn)
{
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT a.MaCB, a.HoTen, b.SoTien
FROM lylich a, thunhap b WHERE a.MaCB = b.MaCB';
//---------------------------------------
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['MaCB']} <br> ".
"Count: {$row['HoTen']} <br> ".
"Tutorial ID: {$row['SoTien']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
Câu lệnh sql này không thể in ra các record, trong table thunhap, mà giá trị trường MaCB của nó không xuất hiện ở trường MaCB trong bảng lylich.
MySQL Left Joins
Left join là một hình thức khác của single join, nó cho phép xem xét mở rộng đối với table bên trái.
Nếu chỉ định left join được đưa ra thì tất cả record trong table thunhap được chọn ra cho dù MaCB của nó không tìm thấy ở trường MaCB ở table lylich.
Ví dụ:
root@ubuntu# mysql -u root -p password;
Enter password:*******
mysql> use HSCB;
Database changed
mysql> SELECT a.MaCB, a.HoTen, b.SoTien
-> FROM lylich a LEFT JOIN thunhap b
-> ON a.MaCB = b.MaCB;
Trong thực tế có rất nhiều truy vấn dữ liệu cần đến sự trợ giúp của left join, vì thế chúng ta sẽ trở lại vấn đề này ở các bài sau.
(Nguyễn Kim Tuấn - K.CNTT)
» Tin mới nhất:
» Các tin khác: