2013-03-18 57 views
0

我有四張桌子:人,教練,球員,遊戲。我需要編寫一個SQL SELECT語句,它將返回:我的ID,姓名,出生日期,加入日期,與我註冊的教練的姓名以及遊戲的日期,時間和持續時間。如何編寫一個從多個表中返回值的SQL SELECT語句?

人員表格包括:人員ID,姓名,出生日期和其他一些不必要的值。 教練表包括:coach id和一些其他不必要的值。 玩家表包含:玩家ID,加入日期,加入。 遊戲桌包括:教練ID,球員ID,比賽日期,比賽時間,比賽時間。

人桌基本上存儲了教練員和球員的所有名字和主要細節。這些表格鏈接正確。

我試過各種陳述,但我完全糊塗了自己。這個例子有點蹩腳,我有其他的東西,但不知道如何去做。

例如

SELECT person_id, full_name, date_of_birth, join_date 
FROM (person JOIN player ON player_id = person_id) 
WHERE person_id='100' AND person_id, full_name 
FROM (person JOIN coach ON coach_id = person_id); 

這些是CREATE語句:

CREATE TABLE person (
     person_id   CHAR(10) NOT NULL, 
     full_name   VARCHAR(54) NOT NULL, 
     date_of_birth  DATE, 
     sex    CHAR(1), 
    PRIMARY KEY (person_id) 
) engine innodb; 
CREATE TABLE coach (
     coach_id   CHAR(10) NOT NULL, 
     phone_no   CHAR(10) NOT NULL, 
     hall_no   CHAR(4) NOT NULL, 
    PRIMARY KEY (coach_id), 
    FOREIGN KEY (coach_id) REFERENCES person (person_id) 
) engine innodb; 
CREATE TABLE player (
     player_id  CHAR(10) NOT NULL, 
     join_date DATE  NOT NULL, 
     joined_with CHAR(10), 
    PRIMARY KEY (player_id), 
    FOREIGN KEY (player_id) REFERENCES person (person_id), 
    FOREIGN KEY (joined_with) REFERENCES coach (coach_id) 
) engine innodb; 
CREATE TABLE game (
     coach_id  CHAR(10) NOT NULL, 
     player_id  CHAR(10) NOT NULL, 
     game_date  DATE  NOT NULL, 
     game_time  TIME  NOT NULL, 
     game_duration INTEGER DEFAULT 10, 
    PRIMARY KEY (coach_id, player_id, game_date, game_time), 
    FOREIGN KEY (coach_id) REFERENCES coach (coach_id), 
    FOREIGN KEY (player_id) REFERENCES player (player_id) 
) engine innodb; 
+1

使用有效的語法將有所幫助。發佈*真實*錯誤消息和/或意外的輸出。但是,我建議閱讀一些「SQL連接教程」 - 這樣做可以制定一個更好的基礎問題。 – 2013-03-18 22:00:00

+0

請將您的創建語句添加到問題中。 – 2013-03-18 22:00:23

+0

我已經添加了創建語句。沒有錯誤信息,因爲我沒有聲明,我認爲你誤解了這個問題。感謝-1。我知道我應該自己做一些更多的研究,如果不是不可預見的情況,我會這樣做。我確信我可以自己解決這個問題,但我需要更多的時間,而我目前還沒有。 – Hazzle 2013-03-18 22:13:40

回答

1

您的SQL很有用。它看起來像你想使用一些INNER JOINs以下剛:

SELECT p.person_id, p.full_name, p.date_of_birth, pl.join_date, 
    c.coach_id, p2.full_name as coach_name, g.* 
FROM person p 
    JOIN player pl ON p.person_id = pl.player_id   
    JOIN game g ON p.person_id = g.player_id 
    JOIN coach c ON c.coach_id = g.coach_id 
    JOIN person p2 on c.coach_id= p2.person_id   
WHERE p.person_id='1' 
ORDER BY p.person_id, p.full_name 

你不會需要在人重返第二次,如果你不需要教練的名字 - 我只是推測會是有用的信息。

SQL Fiddle Demo

+0

這是完美的,正是我所需要的。這對我很有幫助,因爲我現在可以對其進行逆向工程並從中吸取教訓。這將有助於我寫一些其他的陳述。感謝鏈接到SQL Fiddle,它將在未來有用。我還不能投票,但一旦我獲得足夠的代表點,我會。謝謝。 :) – Hazzle 2013-03-18 22:45:25

+0

@Hazzle - np,很高興我能幫上忙。祝你好運! – sgeddes 2013-03-18 22:50:07

0

我希望這有助於。

SELECT person.person_id, person.full_name, person.date_of_birth, player.join_date 
FROM person 
INNER JOIN player 
    ON player.player_id = person.person_id 
WHERE person.person_id = '100' 
+0

感謝您的幫助,不是我所需要的與上面的答案相比,儘管我可以繼續這一點,所以再次感謝你。 – Hazzle 2013-03-18 22:58:25

相關問題