如何在MySQL中设计一个“视图”来获得我想要的结果?

时间:2012-05-08 23:59:19

标签: mysql

我设法从MySQL数据库中的某些数据创建视图,如下所示:

mysql> CREATE VIEW phonelist AS
    -> SELECT parent.parentID AS ParentID,
    -> ParentPerson.firstName AS ParentFirstName,
    -> ParentPerson.lastName AS  ParentLastName,
    -> ChildPerson.firstName AS PlayerFirstName,
    -> ChildPerson.lastName AS  PlayerLastName,
    -> GuardianHomePhone.homeNumber AS GuardianHomePhone
    -> FROM parent
    -> JOIN player ON (parent.parentID IN (player.motherID, player.fatherID))
    -> JOIN person AS ParentPerson ON (ParentPerson.personID = parent.parentID)
    -> JOIN person AS  ChildPerson ON (ChildPerson.personID = player.playerID)
    -> JOIN addressDetails AS GuardianHomePhone ON (GuardianHomePhone.personID = parent.parentID);

Query OK, 0 rows affected (0.00 sec)

mysql> select * from phonelist;

+----------+-----------------+----------------+-----------------+----------------+-------------------+
| ParentID | ParentFirstName | ParentLastName | PlayerFirstName | PlayerLastName | GuardianHomePhone |
+----------+-----------------+----------------+-----------------+----------------+-------------------+
|        8 | Gregory         | Peck           | Michael         | Peck           | 034871234         |
|        9 | Laura           | Peck           | Michael         | Peck           | 034871234         |
|       10 | Martha          | Petersen       | Matt            | Petersen       | 034724321         |
|       10 | Martha          | Petersen       | Christopher     | Petersen       | 034724321         |
|       11 | Chris           | Michaels       | Richard         | Michaels       | 034791212         |
|       11 | Chris           | Michaels       | Shaun           | Michaels       | 034791212         |
|       12 | Nadine          | Michaels       | Richard         | Michaels       | 034791212         |
|       12 | Nadine          | Michaels       | Shaun           | Michaels       | 034791212         |
|       13 | Barry           | Dackers        | Harry           | Dackers        | 034871996         |
|       14 | Kevin           | Mitchell       | Daniel          | Mitchell       | 034742886         |
|       15 | Rebecca         | Mitchell       | Daniel          | Mitchell       | 034742886         |
+----------+-----------------+----------------+-----------------+----------------+-------------------+
11 rows in set (0.00 sec)

mysql>

创建此视图是一项挑战,但下面的描述是我在导航时遇到的问题:

我还需要使用此视图添加每个玩家所在的团队。因为让团队的名字匹配需要将4个表连在一起,所以我很难将各种东西合并在一起。我设法创建了一个单独的查询,将玩家与以下团队匹配:

mysql> select person.firstName, person.lastName, team.teamName
    -> from person join player on person.personID = player.playerID
    -> join teamAllocation on person.personID = teamAllocation.playerID
    -> join team on teamAllocation.teamID = team.teamID;

+-------------+----------+------------+
| firstName   | lastName | teamName   |
+-------------+----------+------------+
| Michael     | Peck     | U10 Red    |
| Christopher | Petersen | U10 Red    |
| Richard     | Michaels | U11 Orange |
| Shaun       | Michaels | U9 Yellow  |
| Matt        | Petersen | U11 Orange |
| Harry       | Dackers  | U9 Yellow  |
| Daniel      | Mitchell | U9 Yellow  |
+-------------+----------+------------+
7 rows in set (0.00 sec)

mysql>

我在脑海中想象的结果是这样的:

+----------+-----------------+----------------+-----------------+----------------+----------------+-------------------+
| ParentID | ParentFirstName | ParentLastName | PlayerFirstName | TeamName       | PlayerLastName | GuardianHomePhone |
+----------+-----------------+----------------+-----------------+----------------+----------------+-------------------+
|        8 | Gregory         | Peck           | Michael         | U10 Red        | Peck           | 034871234         |
|        9 | Laura           | Peck           | Michael         | U10 Red        | Peck           | 034871234         |
|       10 | Martha          | Petersen       | Matt            | U11 Orange     | Petersen       | 034724321         |
|       10 | Martha          | Petersen       | Christopher     | U10 Red        | Petersen       | 034724321         |
|       11 | Chris           | Michaels       | Richard         | U11 Orange     | Michaels       | 034791212         |
|       11 | Chris           | Michaels       | Shaun           | U9 Yellow      | Michaels       | 034791212         |
|       12 | Nadine          | Michaels       | Richard         | U11 Orange     | Michaels       | 034791212         |
|       12 | Nadine          | Michaels       | Shaun           | U9 Yellow      | Michaels       | 034791212         |
|       13 | Barry           | Dackers        | Harry           | U9 Yellow      | Dackers        | 034871996         |
|       14 | Kevin           | Mitchell       | Daniel          | U9 Yellow      | Mitchell       | 034742886         |
|       15 | Rebecca         | Mitchell       | Daniel          | U9 Yellow      | Mitchell       | 034742886         |
+----------+-----------------+----------------+-----------------+----------------+----------------+-------------------+

如果有人能帮助我,我将非常感激。对于那些想要使用数据测试查询的人,我已将模式(DDL)和数据(DML)脚本(在#{3}}中放入一个"粘贴")。

此外,如果有人认为我可以更好地观看视图,请告诉我。

1 个答案:

答案 0 :(得分:1)

你几乎就在那里,你只需要将两个查询结合起来。

CREATE VIEW phonelistWithTeams AS
SELECT parent.parentID AS ParentID,
  ParentPerson.firstName AS ParentFirstName,
  ParentPerson.lastName AS  ParentLastName,
  ChildPerson.firstName AS PlayerFirstName,
  ChildPerson.lastName AS  PlayerLastName,
  team.teamName AS TeamName,
  GuardianHomePhone.homeNumber AS GuardianHomePhone
FROM parent
  JOIN player ON (parent.parentID IN (player.motherID, player.fatherID))
  JOIN person AS ParentPerson ON (ParentPerson.personID = parent.parentID)
  JOIN person AS  ChildPerson ON (ChildPerson.personID = player.playerID)
  JOIN addressDetails AS GuardianHomePhone ON (GuardianHomePhone.personID = parent.parentID)
  JOIN teamAllocation ON (ChildPerson.personID = teamAllocation.playerID)
  JOIN team ON (teamAllocation.teamID = team.teamID);

正在运行SELECT * FROM phonelistWithTeams会给你

+----------+-----------------+----------------+-----------------+----------------+------------+-------------------+
| ParentID | ParentFirstName | ParentLastName | PlayerFirstName | PlayerLastName | TeamName   | GuardianHomePhone |
+----------+-----------------+----------------+-----------------+----------------+------------+-------------------+
|        8 | Gregory         | Peck           | Michael         | Peck           | U10 Red    | 034871234         |
|        9 | Laura           | Peck           | Michael         | Peck           | U10 Red    | 034871234         |
|       10 | Martha          | Petersen       | Matt            | Petersen       | U11 Orange | 034724321         |
|       10 | Martha          | Petersen       | Christopher     | Petersen       | U10 Red    | 034724321         |
|       11 | Chris           | Michaels       | Richard         | Michaels       | U11 Orange | 034791212         |
|       11 | Chris           | Michaels       | Shaun           | Michaels       | U9 Yellow  | 034791212         |
|       12 | Nadine          | Michaels       | Richard         | Michaels       | U11 Orange | 034791212         |
|       12 | Nadine          | Michaels       | Shaun           | Michaels       | U9 Yellow  | 034791212         |
|       13 | Barry           | Dackers        | Harry           | Dackers        | U9 Yellow  | 034871996         |
|       14 | Kevin           | Mitchell       | Daniel          | Mitchell       | U9 Yellow  | 034742886         |
|       15 | Rebecca         | Mitchell       | Daniel          | Mitchell       | U9 Yellow  | 034742886         |
+----------+-----------------+----------------+-----------------+----------------+------------+-------------------+