哪个Mysql查询将返回此结果?
我有两个相互关联的表A和表B:哪个Mysql查询将返回此结果?,sql,mysql,Sql,Mysql,我有两个相互关联的表A和表B: A: +-------+---------+ | id | type | +-------+---------+ | 1 | apple | | 2 | orange | | 3 | banana | +-------+---------+ B: +-------+---------+-----------+ | id | a_id | rank | +-------+----
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:没问题,只是奇怪的结果并不能说明你得到了什么。但实际上,您对值所做的更改不应该更改查询,而应该更改结果。