2012-05-08 13 views
5

私は探している結果を得る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つのテーブルを一緒に参加する必要があるので、私は一緒に物事をマージしている問題があります。私は、誰もがこの上で私を助けることができる場合

+----------+-----------------+----------------+-----------------+----------------+----------------+-------------------+ 
| 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   | 
+----------+-----------------+----------------+-----------------+----------------+----------------+-------------------+ 

う:私は私の頭の中で可視化しています結果はこのようなものである

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> 

:私は下のチームに選手に一致する別のクエリを作成するために管理しました非常に感謝しています。データでクエリをテストしたい人は、http://pastebin.com/S4iJyJUhにスキーマ(DDL)およびデータ(DML)スクリプトを1つの「ペースト」に入れました。

また、誰かが私がそのビューを行うためのより良い方法があると思ったら、私に教えてください。

+0

+1を与えます! – kba

答えて

1

ほとんどの場合、2つのクエリを組み合わせるだけです。

SELECT * FROM phonelistWithTeamsを実行
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); 

はあなたに、正確であることDDL/DMLを供給し、それが簡単にあなたを助けるために作るための

+----------+-----------------+----------------+-----------------+----------------+------------+-------------------+ 
| 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   | 
+----------+-----------------+----------------+-----------------+----------------+------------+-------------------+ 
+0

私の目が疲れると、AddressDetailsテーブルにpersonIDがあることを忘れてしまいました。テーブルの主キーと同じように忘れてはいけません。私はGROUP_CONCATを使用しようとしましたが、私の状況でそれを実装する方法がわかりません(例えば、 "Martha Petersen"は2人の "子供/選手"を持っているので2回繰り返されます) - 理想的には、あなたがやむを得ない場合を除いて、姓と名の組み合わせを繰り返さないことをお勧めします。 あなたの答えは完璧であり、あなたが私を助けてくれることをうれしく思っています:) – Rob

+0

Martha Petersen二度そこにいることは、マットかクリストファーのどちらも現れないことを意味します。それはあなたが欲しいものですか? – kba

関連する問題