2016-12-16 69 views
1

表結構:
教練表加入返回錯誤值的數據庫

+----+-----------+-------+ 
| ID | Name | Age | 
+----+-----------+-------+ 
| 1 | Aaron  | 39 | 
| 2 | John  | 41 | 
| 3 | Macy  | 44 | 
| 4 | Mitchelle | 37 | 
| 5 | Candice | 32 | 
+----+-----------+-------+ 

見習表

+----+---------+-------+ 
| ID | Name | Age | 
+----+---------+-------+ 
| 6 | Abigail | 9 | 
| 7 | Jim  | 12 | 
| 8 | Jack | 7 | 
| 9 | Maria | 14 | 
| 10 | Andy | 11 | 
+----+---------+-------+ 

收費表

+----+----------+------------+--------+ 
| ID | Coach_ID | Trainee_ID | Fee | 
+----+----------+------------+--------+ 
| 11 |  1 |   7 | 2400 | 
| 12 |  2 |   6 | 2000 | 
| 13 |  3 |   6 | 2000 | 
| 14 |  4 |   8 | 1243 | 
| 15 |  5 |   8 | 1275 | 
| 16 |  3 |   9 | 9010 | 
| 17 |  2 |   8 | 1900 | 
| 18 |  1 |   7 | 600 | 
| 19 |  2 |   10 | 1010 | 
| 20 |  5 |   10 | 2110 | 
+----+----------+------------+--------+ 

所需的輸出

+-----------+--------------+--------+ 
| Name | Trainee_name | Fee | 
+-----------+--------------+--------+ 
| Aaron  | Jim   | 2400 | 
| Candice | Andy   | 2110 | 
| John  | Abigail  | 2000 | 
| Macy  | Maria  | 9010 | 
| Mitchelle | Jack   | 1243 | 
+-----------+--------------+--------+ 

=====

我的查詢

Select 
Coach.Name as Name, Trainee.Name as Trainee_name, Max(Fee.Fee) as Fee 
From Fee 
INNER JOIN Trainee 
    ON Fee.Trainee_ID = Trainee.ID 
INNER JOIN Coach 
    ON Fee.Coach_ID = Coach.ID 
GROUP BY Coach.Name 
ORDER BY Coach.Name; 

我的輸出:

+------------+---------------+--------+ 
| Name  | Trainee_name | Fee | 
+------------+---------------+--------+ 
| Aaron  | Jim   | 2400 | 
| Candice | Jack   | 2110 | 
| John  | Abigail  | 2000 | 
| Macy  | Abigail  | 9010 | 
| Mitchelle | Jack   | 1243 | 
+------------+---------------+--------+ 

對應於康迪斯和梅西的數據是在列trainee_name不正確。

轉儲SQL數據庫的:

CREATE TABLE IF NOT EXISTS `coach` ( 
    `ID` int(11) NOT NULL, 
    `Name` text NOT NULL, 
    `Age` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


INSERT INTO `coach` (`ID`, `Name`, `Age`) VALUES 
(1, 'Aaron', 39), 
(2, 'John', 41), 
(3, 'Macy', 44), 
(4, 'Mitchelle', 37), 
(5, 'Candice', 32); 


CREATE TABLE IF NOT EXISTS `fee` ( 
    `ID` int(11) NOT NULL, 
    `Coach_ID` int(11) NOT NULL, 
    `Trainee_ID` int(11) NOT NULL, 
    `Fee` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


INSERT INTO `fee` (`ID`, `Coach_ID`, `Trainee_ID`, `Fee`) VALUES 
(11, 1, 7, 2400), 
(12, 2, 6, 2000), 
(13, 3, 6, 2000), 
(14, 4, 8, 1243), 
(15, 5, 8, 1275), 
(16, 3, 9, 9010), 
(17, 2, 8, 1900), 
(18, 1, 7, 600), 
(19, 2, 10, 1010), 
(20, 5, 10, 2110); 

CREATE TABLE IF NOT EXISTS `trainee` ( 
    `ID` int(11) NOT NULL, 
    `Name` text NOT NULL, 
    `Age` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


INSERT INTO `trainee` (`ID`, `Name`, `Age`) VALUES 
(6, 'Abigail', 9), 
(7, 'Jim', 12), 
(8, 'Jack', 7), 
(9, 'Maria', 14), 
(10, 'Andy', 11); 
+0

您需要在「費用表」中找到每位教練的最高金額(費用)並返回ID作爲自己的記錄集。然後從記錄集中,您可以進行內部連接,以獲取與正確的受訓者相關的姓名和費用。 – abraxascarab

+1

您的輸出與您的查詢輸出有什麼不同?你還使用了什麼RDBMS? –

+0

它確定傑克是2110費用的實習生,而不是安迪 – Danny

回答

1

試試這個:

SELECT sub.name, trainee.name, sub.mx 
FROM 
(SELECT Fee.Coach_ID, Coach.Name, MAX(fee) AS mx 
FROM Coach 
INNER JOIN Fee ON Coach.ID = Fee.Coach_ID 
GROUP BY Fee.Coach_ID, Coach.Name) sub 
INNER JOIN fee ON sub.coach_ID = fee.coach_ID 
INNER JOIN trainee ON fee.trainee_ID = trainee.id 
WHERE sub.mx = fee.fee 
ORDER BY sub.name 

你可以看到我在這裏運行測試:http://sqlfiddle.com/#!9/cdbad/10

它有你想要的輸出。訣竅是子查詢。您需要首先確定每位教練的最高費用。然後通過收費表加入學員。

+0

謝謝。它爲我工作。 :) – shivam