Как можно обойти отсутствие подзапросов where-clause в старых версиях MySQL? - PullRequest
1 голос
/ 14 октября 2011

У меня есть таблица Foo со столбцами A, B и C. Мне нужно из этого извлечь каждое отдельное значение A и значение C в строке, в которой для этого задано наибольшее значение B A.

Если я сделаю это:

select A, max(B)
from Foo
group by A

Это дает мне наибольшее значение B для каждого A, и я могу выполнить другой запрос на основе этих результатов, чтобы получить значения C, которые мне нужны. Но я бы хотел сделать это за один запрос.

Кто-то может предложить подзапрос в предложении where, но версия MySQL, которую я использую, не поддерживает это. Я не могу обновить MySQL до более поздней версии. Есть ли способ получить то, что мне нужно в одном запросе?

Я использую MySQL 4.0.27.

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Итак, вы хотите выбрать те строки, для каждой A, которые имеют максимум B.
Вы почти на месте - вам просто нужно присоединить ваш запрос обратно к исходной таблице:

SELECT Foo.* FROM Foo 
INNER JOIN (
    SELECT A, MAX(B) AS MAXB 
    FROM Foo 
    GROUP BY A
) AS Subtable -- your original query
ON Subtable.MAXB = Foo.B and Foo.A = Subtable.A;

Примечание. Поскольку я не знаю, какую версию MySQL вы используете, я не могу гарантировать, что она будет работать на вашей.


Обновление: вотпара других примеров замены подзапросов объединениями:

пример 1
пример 2


Второе обновление: из-за проблем совместимости MySQL, эта версия перемещает подзапрос и добавляет неявное соединение, помещая условия соединения в предложение where:

SELECT Foo.* 
FROM 
    Foo, 
    (SELECT A, MAX(B) AS MAXB 
        FROM Foo 
        GROUP BY A
    ) AS Subtable -- your original query
WHERE Subtable.MAXB = Foo.B and Foo.A = Subtable.A;

Источник: согласно руководству MySQLдля 4.0 и 4.1 подзапросы разрешены в FROM -клазах - так что, надеюсь, это работает в вашей системе.

0 голосов
/ 14 октября 2011

Не уверен, что в более раннем MySQL есть поддержка производных таблиц, но я бы использовал что-то вроде этого:

SELECT t2.*
FROM (
    SELECT A, max(B) as B
    FROM Foo
    GROUP BY A
) t1
JOIN (
    SELECT A, max(B) as B, C
    FROM Foo
    GROUP BY A, C
) t2 ON t1.A = t2.A AND t1.B = t2.B

Первая производная таблица будет ограничивать вторую производную таблицу только самым высоким значением B для каждого отдельного A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...