Rails Active Record Mysql найти запрос HAVING предложение - PullRequest
0 голосов
/ 10 апреля 2010

Есть ли способ использовать предложение HAVING другим способом без использования group by.

Я использую рельсы, и ниже приведен пример сценария проблемы, с которой я сталкиваюсь. В рельсах вы можете использовать функцию Model.find (: все,: выбор, условия,: группа) для получения данных. В этом запросе я могу указать предложение в параметре: group. Но что, если у меня нет предложения group by, но я хочу иметь предложение hasing в наборе результатов.

Пример: давайте возьмем запрос

выберите сумму (x) как a, b, c из y, где группа "some_conditions" группируется по b, c;

Этот запрос имеет агрегацию sum () по одному из полей. Нет, если агрегировать нечего, мой результат должен быть пустым. Но mysql возвращает пустую строку. Так что эту проблему можно решить с помощью

выберите сумму (x) как a, b из y, где группа "some_conditions" b имеет NOT NULL;

но что происходит, если у меня нет предложения group by? запрос как показано ниже

выберите сумму (x) как a, b из y, где "some_conditions";

как же указать, что сумма (x) не должна быть NULL?

Поможет любое решение, которое вернет пустой набор в этом случае вместо строки NULL, а также это решение должно быть выполнимо в рельсах.

Мы можем использовать подзапросы, чтобы это условие работало с суммой, подобной этой

выберите * из ((выберите сумму (x) как b ОТ y, где "some_condition") как subq), где subq.b не равно нулю;

но есть ли лучший способ сделать это через sql / rails ??

1 Ответ

0 голосов
/ 11 апреля 2010

Подзапрос является стандартным способом обработки этой ситуации в SQL. Тем не менее, я рекомендую вам не использовать подзапрос или HAVING, а вместо этого проверить, чтобы видеть, является ли SUM (x) NULL. Лучше всегда возвращать результат, поэтому вам не нужно проверять, есть ли он у вас или нет. Если значение равно NULL, то вы знаете, что не было записей со значениями NON NULL.

Одна вещь, которую вы не упомянули: если вы не хотите, чтобы сумма (x) была нулевой, вы можете сделать это:

SELECT IFNULL(SUM(x), 0) AS a FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...