2010-05-27 159 views
23

No he encontrado ejemplos de relaciones MYSQL de muchos a muchos aquí y en google. Lo que estoy buscando es ver un ejemplo muy simple con php + mysql mostrando los resultados de la base de datos. ¿Alguien puede escribir un ejemplo muy simple?Ejemplos de relaciones de muchos a muchos

+0

ver esto: http://www.tonymarston.net/php-mysql/many-to-many.html – nc3b

Respuesta

54

Escenario de ejemplo: estudiantes y cursos en una universidad. Un estudiante determinado puede estar en varios cursos y, naturalmente, un curso generalmente tendrá muchos estudiantes.

mesas ejemplo, el diseño simple:

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 

Encontrar todos los estudiantes inscritos en un curso:

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

Encuentra todos los cursos tomados por un estudiante determinado:

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

Aquí hay una ejemplo rápido y sucio del SQL involucrado. No veo ninguna necesidad de enturbiar el concepto con php. Simplemente recupere el conjunto como lo haría con cualquier otro.

En este ejemplo, hay muchos nombres y muchos colores. Las personas pueden tener más de un color favorito y muchas personas pueden tener el mismo color favorito. De ahí muchos a muchos.


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

¿Eso ayuda?

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

Por favor, dar una explicación con su respuesta –

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) 
Cuestiones relacionadas