首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多关系示例

问多对多关系示例
EN

Stack Overflow用户
提问于 2010-05-28 02:29:42
回答 4查看 54K关注 0票数 42

我在这里和google中都没有找到任何MYSQL多对多关系的例子。我正在寻找的是看到一个非常简单的例子与php+mysql显示数据库的结果。有人能写一个非常简单的例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-28 02:44:23

示例场景:一所大学的学生和课程。一个给定的学生可能会上几门课,而且一门课通常会有很多学生。

示例表格,简单的设计:

代码语言:javascript
复制
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

查找某个课程的所有注册学生:

代码语言:javascript
复制
SELECT
    `Student`.*
FROM
    `Student`
    JOIN `CourseMembership` ON `Student`.`StudentID` = `CourseMembership`.`Student`
WHERE
    `CourseMembership`.`Course` = 1234

查找给定学生选修的所有课程:

代码语言:javascript
复制
SELECT
    `Course`.*
FROM
    `Course`
    JOIN `CourseMembership` ON `Course`.`CourseID` = `CourseMembership`.`Course`
WHERE
    `CourseMembership`.`Student` = 5678
票数 86
EN

Stack Overflow用户

发布于 2010-05-28 02:45:25

这里有一个涉及到的SQL的快速而肮脏的示例。我不认为有任何必要用php来混淆这个概念。只需像检索其他集合一样检索集合即可。

在本例中,有许多名称和颜色。人们可以有多个喜欢的颜色,许多人可以有相同的喜欢的颜色。因此,多对多。

代码语言:javascript
复制
***** 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...

这有帮助吗?

票数 12
EN

Stack Overflow用户

发布于 2014-11-22 20:53:38

代码语言:javascript
复制
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)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档