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

时间:2018-10-15 17:15:25

标签: sql database

第一个问题。

所以,有一点背景知识,我在开发领域还算是新手,并且正在创建一个数据库优先的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')   
)

先谢谢您。任何建议都将不胜感激!

3 个答案:

答案 0 :(得分:2)

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

一旦适当地构造和填充了表,您将需要执行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'

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

答案 1 :(得分:0)

只需“联接”您所有3个表。可以找到参考here

答案 2 :(得分:0)

您可以尝试以下吗,如果您有任何疑问,请告诉我

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