2010-05-27 100 views
23

Tôi chưa tìm thấy bất kỳ ví dụ về mối quan hệ nhiều-nhiều-nhiều MYSQL nào tại đây và trong google. Những gì tôi đang tìm kiếm là để xem một ví dụ rất đơn giản với php + mysql hiển thị kết quả của cơ sở dữ liệu. Ai có thể viết một ví dụ rất đơn giản?Các ví dụ về mối quan hệ nhiều-nhiều-số

+0

Xem này: http://www.tonymarston.net/php-mysql/many-to-many.html – nc3b

Trả lời

54

Ví dụ: sinh viên và các khóa học tại một trường đại học. Một học sinh nhất định có thể tham gia nhiều khóa học, và dĩ nhiên một khóa học thường có nhiều sinh viên.

bảng Ví dụ, thiết kế đơn giản:

CREATE TABLE `Student` (
    `StudentID` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `FirstName` VARCHAR(25), 
    `LastName` VARCHAR(25) NOT NULL, 
    PRIMARY KEY (`StudentID`) 
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci 

CREATE TABLE `Course` (
    `CourseID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `Code` VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL, 
    `Name` VARCHAR(100) NOT NULL, 
    PRIMARY KEY (`CourseID`) 
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci 

CREATE TABLE `CourseMembership` (
    `Student` INT UNSIGNED NOT NULL, 
    `Course` SMALLINT UNSIGNED NOT NULL, 
    PRIMARY KEY (`Student`, `Course`), 
    CONSTRAINT `Constr_CourseMembership_Student_fk` 
     FOREIGN KEY `Student_fk` (`Student`) REFERENCES `Student` (`StudentID`) 
     ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `Constr_CourseMembership_Course_fk` 
     FOREIGN KEY `Course_fk` (`Course`) REFERENCES `Course` (`CourseID`) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci 

Tìm tất cả học sinh đăng ký một khóa học:

SELECT 
    `Student`.* 
FROM 
    `Student` 
    JOIN `CourseMembership` ON `Student`.`StudentID` = `CourseMembership`.`Student` 
WHERE 
    `CourseMembership`.`Course` = 1234 

Tìm tất cả các khóa học thực hiện bởi một sinh viên đưa ra:

SELECT 
    `Course`.* 
FROM 
    `Course` 
    JOIN `CourseMembership` ON `Course`.`CourseID` = `CourseMembership`.`Course` 
WHERE 
    `CourseMembership`.`Student` = 5678 
7

Dưới đây là một ví dụ nhanh và bẩn của SQL liên quan. Tôi không thấy bất kỳ nhu cầu để lúng túng các khái niệm với php. Chỉ cần lấy bộ như bạn sẽ làm bất kỳ cái nào khác.

Trong ví dụ này, có nhiều tên và nhiều màu sắc. Mọi người được phép có nhiều màu yêu thích và nhiều người có thể có cùng màu yêu thích. Do đó nhiều đến nhiều.


***** Tables ********** 

person 
-------- 
id - int 
name - varchar 

favColor 
------------- 
id - int 
color - varchar 

person_color 
------------ 
person_id - int (matches an id from person) 
color_id - int (matches an id from favColor) 



****** Sample Query ****** 

SELECT name, color 
FROM person 
    LEFT JOIN person_color ON (person.id=person_id) 
    LEFT JOIN favColor ON (favColor.id=color_id) 


****** Results From Sample Query ******* 

Name - Color 
--------------- 
John - Blue 
John - Red 
Mary - Yellow 
Timmy - Yellow 
Suzie - Green 
Suzie - Blue 
etc... 

Điều đó có hữu ích không?

0
SELECT a.a_id, b.b_id, b.b_desc, 
CASE WHEN x.b_id IS NULL THEN 'F' ELSE 'T' END AS selected 
FROM a 
CROSS JOIN b 
LEFT JOIN x ON (x.a_id = a.a_id AND x.b_id = b.b_id) 
WHERE (a.a_id = 'whatever') 
+5

Xin vui lòng cho lời giải thích với câu trả lời của bạn –

3
mysql> SELECT * FROm products; 
+----+-----------+------------+ 
| id | name  | company_id | 
+----+-----------+------------+ 
| 1 | grechka |   1 | 
| 2 | rus  |   1 | 
| 3 | makaronu |   2 | 
| 4 | yachna |   3 | 
| 5 | svuniacha |   3 | 
| 6 | manka  |   4 | 
+----+-----------+------------+ 
6 rows in set (0.00 sec) 

mysql> SELECT * FROm company; 
+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | LVIV  | 
| 2 | KIEV  | 
| 3 | KHarkiv | 
| 4 | MADRID | 
| 5 | MaLIN | 
| 6 | KOROSTEN | 
+----+----------+ 
6 rows in set (0.00 sec) 

mysql> SELECT * FROm many_many; 
+------------+---------+ 
| product_id | city_id | 
+------------+---------+ 
|   1 |  1 | 
|   1 |  3 | 
|   2 |  3 | 
|   1 |  2 | 
|   1 |  4 | 
|   2 |  4 | 
|   2 |  1 | 
|   3 |  1 | 
+------------+---------+ 
8 rows in set (0.00 sec) 

mysql> SELECT products.name,company.name FROM products JOIN many_many ON many_ 
ny.product_id =products.id JOIN company ON company.id= many_many.city_id; 
+----------+---------+ 
| name  | name | 
+----------+---------+ 
| grechka | LVIV | 
| grechka | KHarkiv | 
| grechka | KIEV | 
| grechka | MADRID | 
| rus  | KHarkiv | 
| rus  | MADRID | 
| rus  | LVIV | 
| makaronu | LVIV | 
+----------+---------+ 
8 rows in set (0.00 sec) 
Các vấn đề liên quan