2010-05-27 97 views
23

我還沒有在這裏和谷歌中找到任何MYSQL多對多關係示例。我在看的是看到一個非常簡單的例子,用php + mysql顯示數據庫的結果。任何人都可以寫一個非常簡單的例子嗎?多對多關係示例

+0

看到這個:http://www.tonymarston.net/php-mysql/many-to-many.html – nc3b 2010-05-27 18:37:57

回答

54

示例場景:學生和大學課程。一個給定的學生可能會參加幾門課程,而自然一門課程通常會有很多學生。

例表,簡單的設計:

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 

查找課程註冊的所有學生:

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

查找指定的學生所採取的所有課程:

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

這裏有一個涉及SQL的快速和骯髒的例子。我沒有看到任何需要用php來搗亂這個概念。只要像其他任何其他人一樣檢索該集。

在這個例子中,有許多名字和許多顏色。人們被允許擁有不止一種最喜歡的顏色,許多人可以擁有同樣喜歡的顏色。因此很多很多。


***** 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... 

這有幫助嗎?

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

請給你的答案的解釋 – 2012-10-08 21:13:24

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)