Если я правильно понимаю, вы пытаетесь получить среднюю цену покупки брокколи для каждого пользователя. Вы ближе к достижению этого со своим вторым запросом, вам просто нужно сгруппировать по столбцу UserId (чтобы получить среднее значение для пользователя), а не по столбцу Id (это даст вам среднее значение за покупку - вид бессмысленного) покупок Таблица. Итак, я думаю, все, что вам нужно, это:
SELECT AVG(PRICE), USERID FROM PURCHASES WHERE FOODID=1 GROUP BY USERId
Если вы хотите добавить некоторую информацию о пользователях к вашему выводу, например, их имя, вам нужно объединиться с таблицей Users:
SELECT AVG(P.PRICE), P.USERID, U.NAME
FROM PURCHASES AS P INNER JOIN USERS AS U ON P.USERID = U.ID
WHERE P.FOODID=1
GROUP BY P.USERId, U.NAME
Ваш первый запрос, боюсь, имеет несколько синтаксических проблем. Например, имя aver_output не соответствует таблице или столбцу подзапроса. Если вы пытаетесь назвать свой столбец средней цены, вам понадобится ключевое слово AS (или просто потеряйте запятую). Кроме того, у вас есть подзапрос, и рядом с ним у вас есть таблица (Пользователи) без какой-либо корреляции между ними. Вы должны указать, как вы хотите объединить два, то есть хотите ли вы внутреннее, внешнее, левое или правое соединение. В большинстве систем вы также можете использовать запятую для обозначения соединения, но у вас его даже нет. В любом случае, даже если вы исправите синтаксис, подзапрос не нужен, так как вы можете достичь того же самого без него.
Правка (после правки на исходное сообщение): Лучший способ включить пользователей, которые никогда не покупали брокколи, - это выполнить левое соединение с таблицей ПОКУПКИ, как в вашей последней попытке. Однако вам нужно сгруппировать по имени пользователя, потому что оно появляется в вашем списке выбора. Группировка по названию товара в этом случае не нужна. Итак, я предлагаю:
SELECT U.ID, U.NAME, AVG(P.PRICE) FROM USERS AS U LEFT JOIN PURCHASES AS P ON U.ID = P.USERID AND P.FoodId=1 GROUP BY U.ID, U.NAME;