Ruby on Rails получают рекорды по самой высокой цене - PullRequest
1 голос
/ 27 сентября 2010

У меня есть модель Rails-модели, которая называется Orders, у которой есть type_id, location и price. Каждый тип может иметь несколько заказов в одном месте с разными ценами. Проверьте ниже для идеи структуры таблицы.

id | type_id | location_id | price
-----------------------------------
1  | 1       | 1           | 12
2  | 1       | 1           | 14
3  | 1       | 1           | 9
4  | 2       | 1           | 1
5  | 2       | 1           | 4
6  | 3       | 1           | 15
7  | 3       | 1           | 7

Я хочу выбрать все записи по type_id, используя IN пример:

type_ids = "1,2,3"
location_id = 1

Order.find(:all, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids])

Я хочу выбрать запись с самой высокой ценой для каждого типа в этом месте, поэтому набор результатов вернет записи с идентификаторами 2, 5 и 6.

Кажется, я не могу решить запрос поиска для этого, надеюсь, вы понимаете, что я имею в виду. Если не спросить, я могу попытаться объяснить лучше.

Приветствия

Eef

1 Ответ

2 голосов
/ 27 сентября 2010

Если вы хотите получить единственную самую высокую цену для условий, вы можете использовать

Order.find(:first, :conditions => ["location_id = ? and type_id in (?)", location_id, type_ids], :order => 'price DESC')

... потому что этот запрос упорядочит совпадающие записи от самой высокой до самой низкой цены, а затем даст вам первую запись (самая высокая цена).

Если вам нужен элемент с наивысшей ценой для каждого типа, вы, вероятно, отказываетесь от построения запросов Rails и используете find_by_sql до , чтобы получить max(price) для каждого экземпляра type_id (что-то вроде SELECT *, MAX(price) FROM orders WHERE location_id = ? AND type_id IN (?) GROUP BY type_id, но я бы хотел несколько раз выполнить этот запрос к вашей базе данных, чтобы уточнить его сам).

Если ваше число type_id s не очень велико (например, в сотнях), может быть проще просто выполнить вышеуказанный запрос один раз для каждого типа и поместить все результаты в один массив; запрос MySQL будет намного быстрее, особенно для большого числа type_id с, но делать это в Rails будет достаточно, если только вы не решите получить запрос MAX(price) в самый раз.

...