2016-12-16 67 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