Ich habe hier und in Google keine Beispiele für MYSQL-Viele-zu-viele-Beziehungen gefunden. Was ich suche, ist ein sehr einfaches Beispiel mit php+mysql, das die Ergebnisse der Datenbank zeigt. Kann jemand ein ganz einfaches Beispiel schreiben?
Beispiele für Viele-zu-viele-Beziehungen
guten Abend
Beispielszenario: Studierende und Lehrveranstaltungen an einer Hochschule. Ein bestimmter Student kann an mehreren Kursen teilnehmen, und natürlich hat ein Kurs normalerweise viele Studenten.
Beispieltabellen, einfaches Design:
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
Finden Sie alle für eine Lehrveranstaltung eingeschriebenen Studierenden:
SELECT
`Student`.*
FROM
`Student`
JOIN `CourseMembership` ON `Student`.`StudentID` = `CourseMembership`.`Student`
WHERE
`CourseMembership`.`Course` = 1234
Finden Sie alle Kurse, die von einem bestimmten Studenten belegt wurden:
SELECT
`Course`.*
FROM
`Course`
JOIN `CourseMembership` ON `Course`.`CourseID` = `CourseMembership`.`Course`
WHERE
`CourseMembership`.`Student` = 5678
-
Warum hat die CourseMembership-Tabelle ASCII-Zeichensatz?
– John
1. Februar 2019 um 17:58 Uhr
-
Können Sie bitte hinzufügen, wie Daten richtig eingefügt werden? In welcher Reihenfolge usw.
– Chill Appreciator
11. Januar 2020 um 2:28 Uhr
-
Gibt es eine Möglichkeit, den Datensatz in diesem Fall zu aktualisieren? Was ich jetzt tue, ist, den vorhandenen Datensatz zu löschen und im Aktualisierungsfall einen neuen hinzuzufügen? Wie kann ich überprüfen, welcher Datensatz aktualisiert werden soll?
– Tayyab Hayat
23. September 2021 um 9:55 Uhr
Hier ist ein schnelles und schmutziges Beispiel für das beteiligte SQL. Ich sehe keine Notwendigkeit, das Konzept mit PHP zu verwirren. Rufen Sie das Set einfach wie jedes andere ab.
In diesem Beispiel gibt es viele Namen und viele Farben. Menschen dürfen mehr als eine Lieblingsfarbe haben, und viele Menschen können dieselbe Lieblingsfarbe haben. Also viele zu viele.
***** 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...
Hilft das?
zloctb
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 | MILAN |
| 6 | KOR |
+----+----------+
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)
-
Wie für die Grechka, bro(tan)
– Chill Appreciator
11. Januar 2020 um 2:06 Uhr
-
Das habe ich gesucht, danke für das grafische Beispiel
– Ivandez
19. März 2021 um 14:20 Uhr
RuchiS
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')
Sieh dir das an: tonymarston.net/php-mysql/many-to-many.html
– nc3b
27. Mai 2010 um 18:37 Uhr