Я зашел в тупик с тем, как сделать следующее чисто в MySQL, и я прибег к тому, чтобы взять свой набор результатов и впоследствии манипулировать им в ruby, что не кажется идеальным.
Вот вопрос.С набором данных 'items' вроде:
id state_id price issue_date listed
1 5 450 2011 1
1 5 455 2011 1
1 5 490 2011 1
1 5 510 2012 0
1 5 525 2012 1
...
Я пытаюсь получить что-то like :
SELECT * FROM items
WHERE ([some conditions], e.g. issue_date >= 2011 and listed=1)
AND state_id = 5
GROUP BY id
HAVING AVG(price) <= 500
ORDER BY price DESC
LIMIT 25
По сути, я хочу получить "группу""предметов, средняя цена которых падает ниже определенного порога.Я знаю, что мой приведенный выше пример «группировать по» и «иметь» не верен, поскольку он просто даст AVG(price)
этого одного элемента, что на самом деле не имеет смысла.Я просто пытаюсь проиллюстрировать мой желаемый результат.
Важно отметить, что я хочу всех отдельных элементов в моем наборе результатов, я не хочу просто видеть одну строку со средней ценой, итоговой суммой и т. Д.
В настоящее время я просто делаю вышеуказанный запрос без HAVING AVG(price)
и добавляю отдельные элементы по одному (в рубине), пока не достигну желаемого среднего.Было бы здорово, если бы я мог понять, как это сделать в SQL.Использование подзапросов или что-то умное, например, присоединение таблицы к себе, безусловно, приемлемые решения, если они работают хорошо!Спасибо!
ОБНОВЛЕНИЕ: В ответ на ответ Тудора ниже приведены некоторые пояснения.Всегда будет целевое количество в дополнение к целевому среднему.И мы всегда сортировали бы результаты по цене от низкой к высокой и по дате.
Так что, если бы у нас было 10 товаров по цене 5 долларов, и мы хотели бы найти 5 товаров со средним значением <6 долларов, мыпросто вернуть первые 5 предметов.Мы не вернем только первый и не вернем первые 3, сгруппированные с последними 2. По сути, сейчас мой код в ruby работает. </p>