Mysql Join返回不正确的值

Mysql Join返回不正确的值,mysql,sql,Mysql,Sql,数据库的表结构: 教练台 +----+-----------+-------+ | ID | Name | Age | +----+-----------+-------+ | 1 | Aaron | 39 | | 2 | John | 41 | | 3 | Macy | 44 | | 4 | Mitchelle | 37 | | 5 | Candice | 32 | +----

数据库的表结构:
教练台

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

我的问题 我的输出:

+------------+---------------+--------+  
|   Name     | Trainee_name  | Fee    |  
+------------+---------------+--------+  
| Aaron      | Jim           | 2400   |  
| Candice    | Jack          | 2110   |  
| John       | Abigail       | 2000   |  
| Macy       | Abigail       | 9010   |  
| Mitchelle  | Jack          |  1243  |  
+------------+---------------+--------+ 
学员姓名列中Candice和Macy对应的数据不正确

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);  
试试这个:

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
您可以看到我在此处运行的测试:


它有你想要的输出。关键在于子查询。您需要首先确定每个教练的最高费用。然后通过费用表加入学员。

您需要在“费用表”中找到每个教练的最高费用,并将ID作为自己的记录集返回。然后,从该记录集中,您可以进行内部联接,以获得与正确学员相关联的姓名和费用。您所需的输出与查询的输出有何不同?还有,你用的是什么关系数据库管理系统?它是用2110的费用而不是Andy@Danny谢谢你的澄清。
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