我有三个相关的表"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
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是Word表,B是音素表.AB是WordPhoneme表,带有'position'列.查询是查找所有以指定的音素.(音素是单词声音,类似于国际拼音字母的使用)