関連する 3 つのテーブル "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
B
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) と同じ行からのものであるとは限りません。これは、列が照合またはグループ化に指定されていない場合に返される値の選択が定義されていないという既知のグループの問題であると思います。
上記のいくつかが理にかなっていることを願っています。私はこれについて過去数時間壁に頭をぶつけていました。どんな助けでも大歓迎です。ありがとう。
(疑問に思われている方のために説明すると、これの実際の使用は Dictionary バックエンドであり、A は単語テーブル、B は音素テーブルです。AB は「位置」列を持つ WordPhoneme テーブルです。クエリは、で終わるすべての単語を検索することです。指定された音素 (音素とは単語の音であり、使用法は国際音声アルファベット に似ています)