我有三个相关表“A(id,val)”,“B(id,val)”和一个值为“AB(aid,bid,val)”的链接表
我正在查询 B 以带回 A 值,例如:
SELECT A.*
FROM A INNER JOIN AB ON A.id = AB.aid INNER JOIN B ON AB.bid = B.id
WHERE B.val = 'foo';
每个 A 都有很多 B,每个 B 都有很多 A。
我崩溃的问题是需要过滤集合,以便查询仅在 AB.val 是任何给定 A/B 对的最大值时才返回行
例如,如果我有数据:
一个
id val
1 something
2 somethingelse
乙
id val
1 foo
2 bar
AB
aid bid val
1 1 3
1 2 2
2 1 1
2 2 4
我只想选择 AB 的第一行和最后一行,因为它们是每个 A 的最大值,然后能够查询 B.val = 'foo' 以仅返回第一行。我不知道如何仅限制 AB 表中的 max val 行。
我能得到的最好的是
SELECT *
FROM A
INNER JOIN
(SELECT aid, bid, MAX(val) AS val FROM AB GROUP BY aid) as AB
ON A.id = AB.aid
INNER JOIN B ON AB.id = B.id
WHERE B.val = 'foo'
但这并不完全奏效。首先,它只是感觉是错误的方法,其次,它返回了错误的投标值。也就是说,从子查询返回的出价不一定与 max(val) 来自同一行。我相信这是一个已知的分组问题,当未为排序规则或分组指定列时选择返回的值未定义。
我希望上面的一些内容是有道理的,在过去的几个小时里,我一直在把头撞在墙上,任何帮助都将不胜感激。谢谢。
(对于那些想知道的人,它的实际用途是用于字典后端,其中 A 是单词表,B 是音素表。AB 是带有“位置”列的单词表。查询是查找所有以结尾的单词一个指定的音素。(音素是一个词的声音,在用法上类似于国际音标)