Когда вы используете GROUP BY, столбцы в списке выбора должны удовлетворять одному из следующих:
- Столбец назван в GROUP BY (например,
btv.id_user
в вашем примере)
- Столбец находится внутри статистической функции (например,
MIN( btv.cas )
)
- Столбец - это функциональная зависимость столбцов, которые вы назвали в GROUP BY.
Это ошибка в вашем запросе: btv.id_zavod
имеет много значений для каждого значения btv.id_user
. Это не удовлетворяет функциональной зависимости. В id_zavod
должно быть только одно значение для каждого значения id_user
, чтобы оно было функциональной зависимостью.
В некоторых брендах баз данных этот запрос фактически выдает ошибку. MySQL более гибок, доверяя вам имена только столбцов в списке выбора, которые являются функциональными зависимостями столбцов, которые вы назвали в GROUP BY.
Вот запрос, который возвращает то, что вы хотите, значение MIN btv.cas
на id_user
с соответствующим значением btv.id_zavod
:
SELECT b1.id_user, b1.id_zavod, b1.cas
FROM btv AS b1
JOIN btu ON (b1.id_user = btu.id_user)
JOIN race ON (b1.id_zavod = race.id_zavod)
LEFT OUTER JOIN btv AS b2 ON (b1.id_user = bt2.id_user AND
(b1.cas > b2.cas OR (b1.cas = b2.cas AND b1.primarykey > b2.primarykey))
WHERE race.type = '8' AND b1.id_user = '607'
AND b2.id_user IS NULL;
Другими словами, вам нужно выполнить соединение, как и раньше, но затем снова присоединить его к btv
, чтобы увидеть, есть ли еще строка с таким же значением id_user
и меньшим значением в cas
. Используйте OUTER JOIN, потому что вы ищете случай, когда нет совпадения. Вы можете проверить это с помощью b2.id_user IS NULL
, потому что OUTER JOIN делает все столбцы NULL, когда нет совпадений.
Обратите внимание, что могут быть связи, поэтому мы добавляем дополнительный термин, используя первичный ключ в качестве прерывателя связей.
Вам не нужно использовать GROUP BY в этом запросе. Об этом позаботились неявно, потому что будет только одна строка, которая удовлетворяет условию OUTER JOIN.