Я бы сделал что-то, что выглядит чудовищно, но останься со мной немного
SELECT
ad.*,
ad_avg.price_average
FROM ad
INNER JOIN (
-- Get the average price per animal
SELECT
ad.animal,
ad.race,
AVG(ad.price) AS price_average
FROM ad
INNER JOIN (
-- Make sure it only gets ads that the user has selected
SELECT DISTINCT
animal,
race
FROM ad
WHERE user = {iduser}
) AS ad_usr
ON ad_usr.animal = ad.animal
AND ad_usr.family = ad.family
GROUP BY ad.animal, ad.race
) AS ad_avg
-- Join the averages onto ad
ON ad.animal = ad_avg.animal
AND ad.race = ad_avg.race
AND ad.price > ad_avg.price_average
WHERE ad.user = {iduser}
Итак, начиная с [QRY1] , выберите комбинации животных / расы, в которых пользователь размещает рекламу, чтобы ограничить типы объявлений, которые усредняются по причинам эффективности
SELECT DISTINCT
animal,
race
FROM ad
WHERE user = {iduser}
Теперь уровень вверх, [QRY2] , здесь используются животные и расы с [QRY1] и определяются общие средние цены для них.
SELECT
ad.animal,
ad.race,
AVG(ad.price) AS price_average
FROM ad
INNER JOIN (
[QRY1]
) AS ad_usr
ON ad_usr.animal = ad.animal
AND ad_usr.family = ad.family
GROUP BY ad.animal, ad.race
А теперь вернемся к запросу верхнего уровня, это объединит таблицу средних значений в таблицу объявлений, выбрав все объявления желаемого пользователя, успех!
SELECT
ad.*,
ad_avg.price_average
FROM ad
INNER JOIN (
[QRY2]
) AS ad_avg
-- Join the averages onto ad
ON ad.animal = ad_avg.animal
AND ad.race = ad_avg.race
AND ad.price > ad_avg.price_average
WHERE ad.user = {iduser}
И только потому, что у меня такое настроение
Я не пробовал приведенный ниже запрос, но теоретически он должен делать почти то же самое, однако требует, чтобы идентификатор пользователя был указан только один раз, и соединяет самый внутренний [QRY1] выбор в кортеже в [QRY2] ГДЕ утверждение. Возможно, стоит попробовать, если он более эффективен, трудно сказать, не проверяя ваш набор данных
SELECT
ad.*,
ad_avg.price_average
FROM ad
INNER JOIN (
SELECT
ad.animal,
ad.race,
AVG(ad.price) AS price_average
FROM ad
WHERE (ad.animal,ad.race) IN (
SELECT DISTINCT
ad.animal,
ad.race
FROM ad,(SELECT @iduser := {iduser}) v
WHERE ad.user = @iduser
)
GROUP BY ad.animal,ad.race
) AS ad_avg
ON (ad.animal,ad.race) = (ad_avg.animal,ad_avg.race)
AND ad.price > ad_avg.price_average
WHERE ad.user = @iduser