哪个Mysql查询将返回此结果?

哪个Mysql查询将返回此结果?,sql,mysql,Sql,Mysql,我有两个相互关联的表A和表B: A: +-------+---------+ | id | type | +-------+---------+ | 1 | apple | | 2 | orange | | 3 | banana | +-------+---------+ B: +-------+---------+-----------+ | id | a_id | rank | +-------+----

我有两个相互关联的表A和表B:

A:
+-------+---------+ 
| id    | type    | 
+-------+---------+ 
| 1     | apple   | 
| 2     | orange  | 
| 3     | banana  | 
+-------+---------+ 

B:
+-------+---------+-----------+ 
| id    | a_id    |  rank     |  
+-------+---------+-----------+  
| 1     | 1       |  9.9      |
| 2     | 1       |  7.7      |
| 3     | 2       |  3.3      |
| 4     | 2       |  8.8      |
| 5     | 2       |  1.1      |  
| 6     | 3       |  3.3      |
| 7     | 3       |  2.2      | 
| 8     | 1       |  0.0      | 
+-------+---------+-----------+   
哪个mysql查询将返回以下结果

选择表B中最后插入的秩,它不是MAXrank

结果表中的排名需要从id最高的表B中选择。

更新

您可能希望尝试与子查询联接以获取表_b中每个a_id的MAXid,然后与表_b进行内部联接以获取秩:

SELECT   ta.id, 
         ta.type,
         tb.rank
FROM     table_a ta
JOIN     (
            SELECT   MAX(id) AS id, 
                     a_id
            FROM     table_b
            GROUP BY a_id
         ) sub_q ON (sub_q.a_id = ta.id)
JOIN     table_b tb ON (tb.id = sub_q.id)
ORDER BY ta.id;
测试用例:

CREATE TABLE table_a (id int, type varchar(10));
CREATE TABLE table_b (id int, a_id int, rank decimal(2,1));

INSERT INTO table_a VALUES (1, 'apple');
INSERT INTO table_a VALUES (2, 'orange');
INSERT INTO table_a VALUES (3, 'banana');

INSERT INTO table_b VALUES (1, 1, 9.9);      
INSERT INTO table_b VALUES (2, 1, 7.7);       
INSERT INTO table_b VALUES (3, 2, 3.3);       
INSERT INTO table_b VALUES (4, 2, 8.8);      
INSERT INTO table_b VALUES (5, 2, 1.1);         
INSERT INTO table_b VALUES (6, 3, 3.3);       
INSERT INTO table_b VALUES (7, 3, 2.2);       
INSERT INTO table_b VALUES (8, 1, 0.0);      
结果:

+------+--------+------+
| id   | type   | rank |
+------+--------+------+
|    1 | apple  |  0.0 |
|    2 | orange |  1.1 |
|    3 | banana |  2.2 |
+------+--------+------+
3 rows in set (0.01 sec)
更新

您可能希望尝试与子查询联接以获取表_b中每个a_id的MAXid,然后与表_b进行内部联接以获取秩:

SELECT   ta.id, 
         ta.type,
         tb.rank
FROM     table_a ta
JOIN     (
            SELECT   MAX(id) AS id, 
                     a_id
            FROM     table_b
            GROUP BY a_id
         ) sub_q ON (sub_q.a_id = ta.id)
JOIN     table_b tb ON (tb.id = sub_q.id)
ORDER BY ta.id;
测试用例:

CREATE TABLE table_a (id int, type varchar(10));
CREATE TABLE table_b (id int, a_id int, rank decimal(2,1));

INSERT INTO table_a VALUES (1, 'apple');
INSERT INTO table_a VALUES (2, 'orange');
INSERT INTO table_a VALUES (3, 'banana');

INSERT INTO table_b VALUES (1, 1, 9.9);      
INSERT INTO table_b VALUES (2, 1, 7.7);       
INSERT INTO table_b VALUES (3, 2, 3.3);       
INSERT INTO table_b VALUES (4, 2, 8.8);      
INSERT INTO table_b VALUES (5, 2, 1.1);         
INSERT INTO table_b VALUES (6, 3, 3.3);       
INSERT INTO table_b VALUES (7, 3, 2.2);       
INSERT INTO table_b VALUES (8, 1, 0.0);      
结果:

+------+--------+------+
| id   | type   | rank |
+------+--------+------+
|    1 | apple  |  0.0 |
|    2 | orange |  1.1 |
|    3 | banana |  2.2 |
+------+--------+------+
3 rows in set (0.01 sec)
那么这个呢:

SELECT a.id, a.type, b.rank 
FROM tempa a, tempb b 
WHERE a.id = b.a_id 
  AND b.id = (
    SELECT MAX(b.id) 
    FROM tempb b 
    WHERE b.a_id = a.id
)
ORDER BY a.id;
产出:

1, apple, 9.50
2, orange, 1.10
3, banana, 5.50
那么这个呢:

SELECT a.id, a.type, b.rank 
FROM tempa a, tempb b 
WHERE a.id = b.a_id 
  AND b.id = (
    SELECT MAX(b.id) 
    FROM tempb b 
    WHERE b.a_id = a.id
)
ORDER BY a.id;
产出:

1, apple, 9.50
2, orange, 1.10
3, banana, 5.50


这取决于你在结果中的排名是从哪里来的。这是怎么一回事?对于某些项目,它似乎是最大值,而对于其他项目,它似乎是最小值。请先解释一下你的期望。是的,我假设orage中有错误。还是有意的?@Daniel:这不是一个错误-我把它放在那里是为了表明被挑选的结果不是MAXrankYou在表a中有东西,在表a中有各种可能的等级。基于什么,你想从表B中挑选匹配的行?@Lost_in_代码:我已经更新了我的答案。现在适合测试用例。如果您需要任何澄清,请告诉我。这取决于您从哪里获得的结果排名。这是怎么一回事?对于某些项目,它似乎是最大值,而对于其他项目,它似乎是最小值。请先解释一下你的期望。是的,我假设orage中有错误。还是有意的?@Daniel:这不是一个错误-我把它放在那里是为了表明被挑选的结果不是MAXrankYou在表a中有东西,在表a中有各种可能的等级。基于什么,你想从表B中挑选匹配的行?@Lost_in_代码:我已经更新了我的答案。现在适合测试用例。如果您需要任何澄清,请告诉我。那么他正在寻找最近的排名,或者至少是ID最高的排名?@Daniel:谢谢!你能解释一下这些:t.id,t.type,sub_t1吗?我已经用更清晰的别名更新了我的答案。因此,从SELECT id开始,从表a中键入。这将返回不带排名的结果集。然后我们创建一个子查询SELECT MAXid AS id,a_id FROM table_b GROUP BY a_id。这将构建一个结果集,为每个a_id提供MAXid。我们为这个子查询提供别名sub_q,并在sub_q.a_id=ta.id上将我们以前的结果集与这个子查询内部联接。现在我们知道表_b中的哪一行包含每种类型的秩。因此,我们在tb.id=sub_q.id上与表_b进行内部联接,以获得排名。@Lost_in_code:and发布的答案与此查询的解释类似。也许你会发现它们的格式更清晰,但我更喜欢我描述的那种。@Daniel:很有魅力。我会选择你的,因为这是第一个答案:那么他在寻找最近的排名,或者至少是ID最高的排名?@Daniel:谢谢!你能解释一下这些:t.id,t.type,sub_t1吗?我已经用更清晰的别名更新了我的答案。因此,从SELECT id开始,从表a中键入。这将返回不带排名的结果集。然后我们创建一个子查询SELECT MAXid AS id,a_id FROM table_b GROUP BY a_id。这将构建一个结果集,为每个a_id提供MAXid。我们为这个子查询提供别名sub_q,并在sub_q.a_id=ta.id上将我们以前的结果集与这个子查询内部联接。现在我们知道表_b中的哪一行包含每种类型的秩。因此,我们在tb.id=sub_q.id上与表_b进行内部联接,以获得排名。@Lost_in_code:and发布的答案与此查询的解释类似。也许你会发现它们的格式更清晰,但我更喜欢我描述的那种。@Daniel:很有魅力。我同意你的观点,因为这是第一个答案:这个查询输出了一个奇怪的结果@迷失在代码中:你说的奇异是什么意思?它输出初始问题的结果,不是吗?当然,既然你改变了问题,你就否定了我的答案,但是,你所说的奇怪是什么意思?@Lost_in_code:它确实适用于我在回答中定义的测试用例。用tempa代替表a,用tempb代替表b。你得到了什么结果?对不起,无意冒犯。它输出了大量额外的行,这似乎不正确。为了提高可读性,我修改了问题。现在您将看到的不是9.50,1.10,5.50,而是0.0,1.1,2.2-这对查询没有影响,将重新检查我是否做了什么wrong@Lost_in_code:没问题,只是奇怪的结果并不能说明你得到了什么。但实际上,您对值所做的更改不应该更改查询,而应该更改结果。此查询输出了一个奇怪的结果@迷失在代码中:你说的奇异是什么意思?它输出初始问题的结果,不是吗?当然,既然你改变了问题,你就否定了我的答案,但你说的奇怪是什么意思?@Lost_in_code:It
我在回答中定义了测试用例。用tempa代替表a,用tempb代替表b。你得到了什么结果?对不起,无意冒犯。它输出了大量额外的行,这似乎不正确。为了提高可读性,我修改了问题。现在您将看到的不是9.50,1.10,5.50,而是0.0,1.1,2.2-这对查询没有影响,将重新检查我是否做了什么wrong@Lost_in_code:没问题,只是奇怪的结果并不能说明你得到了什么。但实际上,您对值所做的更改不应该更改查询,而应该更改结果。