gpt4 book ai didi

sql - 有趣的多对多 sql 连接

转载 作者:行者123 更新时间:2023-12-04 20:26:21 24 4
gpt4 key购买 nike

我有三个相关表“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 是带有“位置”列的 WordPhoneme 表。查询是查找所有以一个指定的音素。(音素是一个词的声音,用法类似于国际音标)

最佳答案

我认为您需要先进行另一个连接以获取每个 a.id 的 ab 最大值。
像这样:

select a.*
from a
left join (
select aid, max(val) as val
from ab
group by aid
) abmax on abmax.aid=a.id
inner join ab on ab.aid=abmax.aid and ab.val=abmax.val
inner join b on b.id=ab.bid
where b.val='foo'

关于sql - 有趣的多对多 sql 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com