簡體   English   中英

查詢具有一對多關系的數據庫

[英]Querying a database with a one to many relationship

我正在建立一個數據庫,當用戶注冊時,他們會選擇3種他們想玩的游戲。 游戲與用戶信息表(個人信息)存儲在單獨的表(gameinfo)中。 我正在查詢顯示的第一個游戲,但我希望為每個用戶顯示所有三個。 我將如何實施所有游戲的展示?

我試圖為每個游戲創建不同的變量,但是這似乎並沒有按我預期的那樣工作並壞了。 當游戲存儲在個人信息表中時,它們會以數字1或2的形式存儲。這些鏈接到gameinfo表,並且是每個游戲的主鍵。

數據庫結構
https://imgur.com/a/qee9C1t

    $conn = mysqli_connect('localhost', 'root', '', 'esportclub');
    $sql = "SELECT user_ID, username, Email, Gender, firstName, lastName, gameName FROM personalinformation, gameinfo WHERE game_id = firstGame";
    $result = mysqli_query ($conn, $sql);


    if (mysqli_num_rows($result) > 0) {
      echo "<table>";

      while($row = mysqli_fetch_assoc($result)) {
        echo " <tr><td> Name: ". $row{"username"}. " </td><td> Email: ". $row{"Email"}.  " </td><td> Gender: ". $row{"Gender"}. "</td>" .
          "<td> First Name: ". $row{"firstName"}. " </td><td> First Game: ". $row{"gameName"}. "</td><td> Last Name: ". $row{"lastName"}. "</td>" . "</td></tr>" ;
      }
      echo "</table>";
    } 
    else{
      echo "0 results";
    }
    $conn->close();

如我的評論中所述,我將通過存儲唯一的user_IDgame_id值對來創建一個表,以將用戶和游戲相關聯。 然后,我將表相應地聯接在一起。

但是,我看到您在personalinformation表中的firstGamesecondGamethirdGame列中存儲了每個用戶的三個游戲值。

在這種情況下,您可以將游戲表加入這些列中的每一列。
因此,使用您現有的結構:

SELECT
    p.*,
    game1.`gameName` as `firstGame_name`,
    game2.`gameName` as `secondGame_name`,
    game3.`gameName` as `thirdGame_name`
FROM `personalinformation` p
LEFT JOIN `games` as game1 ON (game1.`game_id` = p.`firstGame`)
LEFT JOIN `games` as game2 ON (game2.`game_id` = p.`secondGame`)
LEFT JOIN `games` as game3 ON (game3.`game_id` = p.`thirdGame`)
WHERE 1; // or WHERE p.`user_ID` = :user_ID;

編輯

由於許多用戶可以擁有一個游戲,而一個用戶可以擁有許多游戲,因此這聽起來像“多對多”關系。

對於這種類型的關系,這是我的首選方法。 優勢之一是您無需限制分配的游戲數量。 也就是說,用戶可以擁有任意數量的游戲。

創建第三個表來存儲唯一的用戶/游戲對。
它將告訴您哪些游戲分配給了哪些用戶。
就像是:

CREATE TABLE `user_game` (
  `user_id` MEDIUMINT NOT NULL ,
  `game_id` MEDIUMINT NOT NULL
);
ALTER TABLE `user_game`
  ADD UNIQUE `unique pair` (`user_id`, `game_id`);

然后將三個表連接在一起:

SELECT
    u.*,
    g.`game_id`,
    g.`gameName`
FROM `personalinformation` u
LEFT JOIN `user_game` as ug ON ( ug.`user_id` = u.`user_ID` )
LEFT JOIN `games` as g ON ( g.`game_id` = ug.`game_id` )
WHERE 1;

對於每個用戶/游戲關系,您都會返回一行。
如果一個用戶擁有三個游戲,那么該用戶將在結果中包含gameName ,每一行包含一個gameName

例如:

Name   Game
----   -----------------
Jane   League of Legends
Jane   Minecraft
Fred   Dota 2
Alex   Minecraft
Alex   War Dragons
Alex   Fortnite

更復雜的顯示可能需要一些處理:

<?php

$users = array();

while($row= mysqli_fetch_object($result)) {

    $uid = $row->user_ID;

    // if this user isn't in the array...
    if (!array_key_exists($uid,$users)) {

        // ... create a user entry ...
        $user = new stdClass();
        $user->firstname = $row->firstName;

        // ... and add it to the user array.
        $users[$uid] = $user;

    }

    // if this row has a valid game ...
    if (!empty($row->game_id)) {

        // ... create a game entry ...
        $game = new stdClass();
        $game->id = $row->game_id;
        $game->name = $row->gameName;

        //.. and add the game to the user's entry
        $users[$uid]->games[$game->id]=$game;

    }

}

對於這樣的結構:

Array
(
    [1] => stdClass Object
        (
            [firstname] => Jane
            [games] => Array
                (
                    [1] => stdClass Object
                        (
                            [id] => 1
                            [name] => Leage of Legends
                        )

                    [2] => stdClass Object
                        (
                            [id] => 2
                            [name] => Minecraft
                        )

                )

        )

    [2] => stdClass Object
        (
            [firstname] => Fred
            [games] => Array
                (
                    [3] => stdClass Object
                        (
                            [id] => 3
                            [name] => Dota 2
                        )

                )

        )

    [3] => stdClass Object
        (
            [firstname] => Alex
            [games] => Array
                (
                    [2] => stdClass Object
                        (
                            [id] => 2
                            [name] => Minecraft
                        )

                    [4] => stdClass Object
                        (
                            [id] => 4
                            [name] => War Dragons
                        )

                    [5] => stdClass Object
                        (
                            [id] => 5
                            [name] => Fortnite
                        )

                )

        )

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM