Я озадачен тем, как сделать следующее исключительно в MySQL, и я прибег к тому, чтобы взять свой набор результатов и впоследствии манипулировать им в ruby, что не кажется идеальным.
Вот вопрос. С набором данных, таких как:
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
...
Я пытаюсь получить что-то вроде:
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 работает прямо сейчас.