Примеры отношений «многие ко многим»

Я не нашел примеров ссылок на многие из многих в MYSQL здесь и в google. Я ищу, чтобы увидеть очень простой пример с php + mysql, показывающий результаты базы данных. Может ли кто-нибудь написать очень простой пример?

Пример сценария: студенты и курсы в университете. Данный студент может быть на нескольких курсах, и, естественно, курс, как правило, будет иметь много учеников.

Примеры таблиц, простой дизайн:

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')