mysql - 需要在我的数据库 sql 中创建 View 方面的帮助

标签 mysql sql database database-view

Click img for schema

我正在尝试根据我拥有的架构构建一个 View 。但现在我完全不知道从哪里开始。我的 View 应包含有关玩家(链接)监护人、监护人的电话号码以及他们当前参加的球队的信息。如果有人能帮助我走上正确的道路,我将非常感激。请参阅附加图片的链接

谢谢!

Im hoping for this kind of result

 +----------+--------------+-------------+----------+-----------+-----------+------------+
|guardianID|guardian.fName|guardianlName|Contact   |playerfName|playerlName|teamName    |
+----------+--------------+-------------+----------+------------+-----------+-----------+
|        1 |Dora          | Kruger      |0288235556|Daphne     |Kruger     |Taeiri Eels |
|        2 |Tonia         | Wesley      |0204156513|Brigitta   |Wesley     |Southern Mag|
|        3 |Shanene       | Genovese    |0211915599|Stefan     |Genovese   |Kaikorai    |
|        4 |Jacob         | Jefferson   |0282316812|Yvonne     |Jefferson  |Pirate Skull|
|        5 |Tamika        | Longstaff   |0264217492|Todd       |Longstaff  |Zingari     |
+----------+--------------+------------+-----------+-----------+-----------+------------+

我有以下数据

====PERSON TABLE====
+----------+--------------+-------------+----------+-----------+
|personID  |firstName     |lastName     |addressID |photo      |
+----------+--------------+-------------+----------+-----------+
|        1 |Dora          | Kruger      |1         |NULL       |
|        2 |Daphne        | Kruger      |2         |NULL       |
|        3 |Tonia         | Wesley      |3         |NULL       |
|        4 |Brigitta      | Wesley      |4         |NULL       |
|        5 |Shanene       | Genovese    |5         |NULL       |
|        6 |Stefan        | Genovese    |6         |NULL       |
|        7 |Jacob         | Jefferson   |7         |NULL       |
|        8 |Yvibbe        | Jefferson   |8         |NULL       |
|        9 |Tamika        | Longstaff   |9         |NULL       |
|        10|Todd          | Longstaff   |10        |NULL       |
+----------+--------------+------------+-----------+-----------+    


====PHONE TABLE====
+----------+--------------+
|phoneID   |primaryContact|
+----------+--------------+
|        1 |0288235556    |
|        2 |0204156513    |
|        3 |0211915599    |
|        4 |0282316812    |
|        5 |0264217492    |
+----------+--------------+

====GUARDIAN TABLE====
+----------+--------------+-------------+----------+
|guardianID|personID      |phoneID      |email     |
+----------+--------------+-------------+----------+
|        1 |  1           | 1           |@ya.com   |
|        2 |  3           | 2           |@yy.com   |
|        3 |  5           | 3           |@ll.com   |
|        4 |  7           | 4           |@pp.com   |
|        5 |  9           | 5           |@no.com   |
+----------+--------------+------------+-----------+    

====PLAYER TABLE====
+----------+--------------+-------------+--------------+
|playerId  |personID      |schoolID     |dob           |
+----------+--------------+-------------+--------------+
|        1 |  2           | 1           |2008-04-06    |
|        2 |  4           | 2           |2011-11-19    |
|        3 |  6           | 3           |2011-01-07    |
|        4 |  8           | 4           |2006-01-01    |
|        5 |  10          | 5           |2004-04-06    |
+----------+--------------+-------------+--------------+


    ====FAMILY TABLE====
+----------+--------------+
|playerID   |guardianID    |
+----------+--------------+
|        1 |1             |
|        2 |2             |
|        3 |3             |
|        4 |4             |
|        5 |5             |
+----------+--------------+


====TEAM TABLE====
+----------+------------------+-------------+--------------+--------------+
|teamID    |teamName          |year         |minAge        |maxAge        |
+----------+------------------+-------------+--------------+--------------+
|        1 |  Taieri Eels     | 2015-01-01  |5             |6             |
|        2 |  Southern Magpies| 2014-01-01  |7             |8             |
|        3 |  Kaikorai        | 2016-01-01  |7             |10            |
|        4 |  Pirate Skulls   | 2014-01-01  |11            |12            |
|        5 |  Zingari         | 2013-01-01  |12            |16            |
+----------+------------------+-------------+--------------+--------------+


    ====TEAM ALLOCATION TABLE====  // allocating team for each player
+----------+--------------+
|teamID    |playerID      |
+----------+--------------+
|        2 |1             |
|        5 |2             |
|        1 |3             |
|        3 |4             |
|        4 |5             |
+----------+--------------+

更新: 监护人表用于识别玩家的监护人。我们试图使用家庭表将玩家与其监护人联系起来,因为这种关系是多对多的。然而,我们正在努力编写查询。我在想这是一个三表连接并使用别名?但我无法让它工作。

SELECT p1.firstName AS guardianFName, p1.lastName AS guardianLName,
p2.firstName AS playerFName, p2.lastName AS playerLName
from person AS p1, person as p2
join guardian on
person.personID = guardian.personID join
family on guardian.guardianID = family.guardianID
join player on 
person.personID = player.personID join
family on player.playerID = family.playerID;

我尝试过一些这样的变体

DDL 和 DML 脚本位于 http://pastebin.com/euVanc2e对于那些想要帮助使用我们拥有的数据测试查询的人。

最佳答案

规范化您的架构会大大简化事情,但这最好作为一个单独的问题来处理。

创建您需要的复杂联接的最佳方法是从简单联接中构建它,并在每个步骤中进行测试以确保您走在正确的轨道上。在这种情况下,对于缺乏经验的开发人员来说,唯一真正的障碍是需要加入 person 两次;这可以通过使用表别名来解决。

让我们分解一下。

当然,第一步是将guardian加入person以获取监护人的姓名:

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId;

我将 person 别名为 p1 而不仅仅是 p 的原因很快就会清楚。

接下来,我们对 playerperson 执行相同的操作来获取玩家的姓名:

SELECT pr.playerId AS playerId,
       p2.firstName AS playerFName, p2.lastName AS playerLName
  FROM player pr
  INNER JOIN person p2
    ON pr.personId = p2.personId;

再次,我将 person 别名为 p2 而不仅仅是 p。最终查询不会显示 playerId 列;此处仅用于说明目的。

现在我们想要将监护人的名字与玩家的名字相匹配。这意味着对于结果中的每一行,我们需要从 person 读取行。我们通过使用两个不同的别名创建两个对 person 的引用来做到这一点。我们只需通过 family 表连接前两个步骤的结果,如下所示:

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName,
       p2.firstName AS playerFName, p2.lastName AS playerLName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId
  INNER JOIN family f
    ON g.guardianId = f.guardianId
  INNER JOIN player pr
    ON f.playerId = pr.playerId
  INNER JOIN person p2
    ON pr.personId = p2.personId;

请注意对 person 的第二个引用,别名为 p2。这给出了对该表的第二个引用,允许结果包含来自两个引用中不同行的数据。

获取电话号码只需一步加入电话即可。

获取团队名称需要分两步加入 team_allocation,然后加入 team。您只需不从 team_allocation 返回任何列即可。

完整的查询应如下所示:

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName,
       ph.primaryContact AS contact,
       p2.firstName AS playerFName, p2.lastName AS playerLName,
       t.teamName AS teamName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId
  INNER JOIN family f
    ON g.guardianId = f.guardianId
  INNER JOIN player pr
    ON f.playerId = pr.playerId
  INNER JOIN person p2
    ON pr.personId = p2.personId
  INNER JOIN phone ph
    ON g.phoneId = ph.phoneId
  INNER JOIN team_allocation ta
    ON ta.playerId = pr.playerId
  INNER JOIN team t
    ON ta.teamId = t.teamId;

希望有帮助。

关于mysql - 需要在我的数据库 sql 中创建 View 方面的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37636404/

相关文章:

mysql - mariadb/mysql - 如何使用 sysdate/curdate 创建日期列?

php - 加入两个表不工作

sql - PostgreSQL 自动递增不使用 COPY 递增

mysql - 关于如何优化这个查询有什么想法吗?

mysql - 如何在选择或表格的每一行中执行过程

mysql - 如何使用 NOT 语法获取记录?

javascript - 使用动态字段将数据插入数据库

mysql - SQL加入正确的用户名

php - 在php中使用json_encode的Mysql更新查询问题

mysql - 如何组合两个不同的 mysql where 子句,每个子句产生 5 行