Запросы на комбинации атрибутов в Rails - Как мне сделать 9 запросов в 1? - PullRequest
1 голос
/ 06 мая 2011

Есть ли способ сжать эти запросы до одного запроса?

Я запрашиваю 1 таблицу для 4 атрибутов: author_id, status, category_id и site_id.Цель состоит в том, чтобы я хотел найти самую последнюю запись в каждом случае (причина заключается в увеличении счетчиков для отчетов):

# author_id
SELECT * FROM posts WHERE posts.author_id = 10 ORDER BY created_at desc LIMIT 1

# author_id + status
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' ORDER BY created_at desc LIMIT 1
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' ORDER BY created_at desc LIMIT 1

# author_id + site_id
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1

# author_id + status + site_id
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' AND posts.site_id = 1 ORDER BY created_at desc LIMIT 1

# author_id + site_id + category_id
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1

# author_id + status + site_id + category_id
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'draft' AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1
SELECT * FROM posts WHERE posts.author_id = 10 AND posts.status = 'published' AND posts.site_id = 1 AND posts.category_id = 7 ORDER BY created_at desc LIMIT 1

Это 9 запросов.Я делаю это в рельсах, поэтому цель состоит в том, чтобы получить 9 Post моделей из одного Post.all(:conditions => x) вызова, после чего я могу отфильтровать их в коде ruby.Это возможно?Какой лучший подход здесь?

Обновление

Вот примерный код, который я использую для генерации этих запросов:

https://gist.github.com/965233

1 Ответ

1 голос
/ 18 мая 2011

Со стороны SQL вы можете использовать UNION для объединения запросов, имеющих совпадающий список полей. Добавьте поле для их сортировки и оберните все в другой запрос для сортировки по этому. Затем вы можете перебрать набор результатов.

SELECT * FROM 
(    
  SELECT 1 QNO, * FROM SOMETABLE WHERE A=1
  UNION ALL
  SELECT 2 QNO, * FROM SOMETABLE WHERE A=1 AND B=2
  UNION ALL
  SELECT 3 QNO, * FROM SOMETABLE WHERE A=2 AND B=4 AND C=11
) 
ORDER BY QNO;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...