多对多关系 - 在多个表中显示行

Posted

技术标签:

【中文标题】多对多关系 - 在多个表中显示行【英文标题】:Many to Many Relationship - Displaying rows in multiple tables 【发布时间】:2018-10-15 17:15:24 【问题描述】:

这里是第一个问题。

所以有一点背景知识,我是开发领域的新手,我正在创建一个数据库优先的 MVC 应用程序,它基本上用作视频游戏及其类型的日志,供游戏玩家根据最能引起他们兴趣的类型。这需要多对多关系,因为一个游戏可能被归类为多种类型,而一种类型可以有多个游戏被归类在它之下。正如它目前在我的 SQL 数据库中一样,我有三个表——游戏、流派和一个链接表。链接表具有 GameID 和 GenreID 的 FK。据我了解(或缺乏),因为游戏表本身有一个链接表并且没有针对流派的实际 FK,我如何能够在每个游戏的信息页面上显示应用于每个游戏的多种流派?是否有我遗漏的东西可以包含在其中一个表中,可能的 SQL 查询会有所帮助,或者一旦我将数据库导入到对其余部分进行编程后,我可以在 Visual Studio 中进行某种硬编码吗?应用程序?

我的数据库看起来像:

CREATE TABLE Game 
(   
    GameID INT IDENTITY(1, 1) NOT NULL,   
    Name NVARCHAR(50) NOT NULL,   
    GameDescription NVARCHAR(200) NULL   
)

CREATE TABLE Genre 
(
    GenreID INT IDENTITY(1, 1) NOT NULL,   
    Genre NVARCHAR(20) NOT NULL   
)

CREATE TABLE GameGenre 
(
     GameGenreID INT IDENTITY(1, 1) NOT NULL,  
     FOREIGN KEY ('GameID') REFERENCES Cities('GameID'),   
     FOREIGN KEY ('GenreID') REFERENCES Cities('GenreID')   
)

提前谢谢你。非常感谢任何和所有建议!

【问题讨论】:

您的 GameGenre 表可能不需要 GameGenreID 列。您可以简单地定义一个包含 GameID 和 GenreID 列的复合主键。这有利于防止 gameID 和genreID 的重复映射。 【参考方案1】:

好问题。虽然简化了,但我认为你的方法是合理的,很明显你已经完成了你的功课。

一旦您的表被正确构建和填充,您将需要执行 SQL 语句以正确获取您要查找的内容。

假设您有上面列出的三个表,如下所示:

| Game        | Genre   | GameGenre   |
|-------------|---------|-------------|
| GameID      | GenreID | GameGenreID |
| Name        | Genre   | GameID      |
| Description |         | GenreID     |

您可以通过您的 GameGenre 表(称为桥接表)“链接”它们。

因此,如果您想查看与特定游戏相关的所有类型,一些示例代码可能是:

SELECT
    Game.GameID,
    Game.Name
    GameGenre.GenreID,
    Genre.Genre

FROM
    Game
        INNER JOIN GameGenre ON Game.GameID = GameGenre.GameID
        INNER JOIN Genre ON GameGenre.GenreID = Genre.GenreID

WHERE
    Game.Name = 'Metal Gear Solid'

您正在做的是从特定游戏开始,然后使用该游戏的 ID 进入桥牌桌。正确加入桥接表后,您可以加入流派表以获取那里的信息。

如果您想从一个流派开始并查看所有相关的游戏,您可以简单地反转该过程。您将从流派开始并加入桥牌表,然后从桥牌表加入游戏。一些示例伪代码如下:

SELECT
    Genre.GenreID,
    Genre.Genre,
    Game.Name

FROM
    Genre
        INNER JOIN GameGenre ON Genre.GenreID = GameGenre.GenreID
        INNER JOIN Game ON GameGenre.GameID = Game.GameID

WHERE
    Genre.Genre = 'Espionage'

希望这会有所帮助!你绝对是在正确的轨道上,我认为你在问正确的问题。如果您需要更好地了解连接,建议您从这里开始:

https://www.w3schools.com/sql/sql_join.asp What is the difference between "INNER JOIN" and "OUTER JOIN"?

【讨论】:

【参考方案2】:

只需“加入”所有 3 张桌子。可以参考here

【讨论】:

【参考方案3】:

你可以试试下面,如果你有任何问题,请告诉我

SELECT G.GameID, G.Name, G.GameDescription, Genre.Genre
FROM Game G
LEFT JOIN GameGenre GG ON G.GameID = GG.GameID
LEFT JOIN Genre Genre ON GG.GenreID = Genre.GenreID 
-- WHERE if you have any where statement

【讨论】:

以上是关于多对多关系 - 在多个表中显示行的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习笔记 — 多对多关系映射

Hibernate的多对多关系

MyBatis中多对多关系的映射和查询

Mybatis-多对多

myBatis 多对多

使用 PHP/CodeIgniter 从具有多对多关系的两个表中显示数据