У меня есть три связанных таблицы «A (id, val)», «B (id, val)» и таблица ссылок со значением «AB (помощь, ставка, 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';
У каждого А есть много Б, и у каждого Б много А.
И уловка, на которой я разбираюсь, заключается в необходимости фильтровать набор так, чтобы запрос возвращал строки только тогда, когда AB.val является максимумом для любой данной пары A / B
например. если у меня есть данные:
A
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', чтобы вернуть только первую строку. Я понятия не имею, как можно ограничиться только строкой max val в таблице AB.
Лучшее, что я смог получить, это
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 со столбцом 'position'. Запрос состоит в том, чтобы найти все слова заканчивающийся указанной фонемой (фонема - это звук слова, по своему употреблению аналогичный международному фонетическому алфавиту)