多对多关系的例子
我还没有在这里和谷歌find任何MYSQL多对多关系的例子。 我所看到的是看到一个非常简单的例子,用php + mysql显示数据库的结果。 任何人都可以写一个非常简单的例子吗?
示例场景:大学的学生和课程。 一个给定的学生可能在几门课程,自然一门课程通常会有很多学生。
示例表,简单的devise:
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
这是一个涉及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...
这有帮助吗?
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)
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')