Error 1111 invalid use of group function запустить код

Learn how to fix MySQL ERROR 1111: Invalid use of group function

When executing a query in MySQL, you may encounter an error saying Invalid use of group function when using aggregate functions like AVG(), SUM(), MAX(), MIN(), and many others.

For example, suppose you have a table named pets that keep the following records:

+----+--------+---------+------+
| id | owner  | species | age  |
+----+--------+---------+------+
|  1 | Jessie | bird    |    2 |
|  2 | Ann    | duck    |    3 |
|  3 | Joe    | horse   |    4 |
|  4 | Mark   | dog     |    4 |
|  5 | Peter  | dog     |    5 |
+----+--------+---------+------+

From this table, you are required to query the table and show rows where the age value is smaller than the average age of all rows.

You may write a SELECT statement as follows, which triggers the Invalid use of group function error:

mysql> SELECT * FROM pets WHERE age < AVG(age);

ERROR 1111 (HY000): Invalid use of group function

The error above is because the AVG() function is used inside the WHERE clause.

Aggregate functions like AVG(), COUNT(), MAX(), MIN(), and many others can’t be used in the WHERE() clause

There are two ways you can solve this error in MySQL:

  • Wrap the aggregate function call in a subquery
  • Use the HAVING clause for the aggregate function call

This tutorial will help you learn how to do both. Let’s start with using the HAVING clause

Fix invalid use of group function with a subquery

When you need to use an aggregate function inside a WHERE clause, you need to wrap the aggregate function call in a subquery.

Returning to the pets table, you can fix the query from this:

SELECT * FROM pets WHERE age < AVG(age);

To this:

SELECT * FROM pets WHERE age < (SELECT AVG(age) FROM pets);

The average age value is 3.6, so the result set will only return rows where age is smaller than that:

+----+--------+---------+------+
| id | owner  | species | age  |
+----+--------+---------+------+
|  1 | Jessie | bird    |    2 |
|  2 | Ann    | duck    |    3 |
+----+--------+---------+------+

That’s one way you can fix the invalid use of group function error. Next, let’s see how to fix the error using a HAVING clause.

Fix invalid use of group function with HAVING clause

From the same pets table above, suppose you want to find out the average age of the pets and show only pets where the average age value is greater than 2.

You may write a SELECT statement as follows:

SELECT species, AVG(age) FROM pets WHERE AVG(age) > 2 GROUP BY species;

But the query above throws the same error because aggregate functions can’t be used in the WHERE clause.

Instead of using the WHERE clause, you can use the HAVING clause as follows:

SELECT species, AVG(age) FROM pets GROUP BY species HAVING AVG(age) > 2;

Now the query should work and returns the correct result.

Conclusion

The MySQL error Invalid use of group function is caused by aggregate functions in your query that’s placed in the wrong clause.

Most likely you are placing one or more aggregate functions inside the WHERE clause, which won’t work because the WHERE clause filters the table before MySQL actually does the computation.

When you’re using a WHERE clause, the SQL query works like this:

  • Filter the rows using the WHERE clause
  • Compute the aggregate functions call

When MySQL runs the WHERE clause, the computation of the aggregate functions hasn’t been executed yet, so it throws an error.

When you’re using a subquery MySQL will evaluate the subquery first, so the average age value in the pets table above will be computed before selecting the rows with the WHERE clause.

Finally, the HAVING clause works like the WHERE clause, but it’s executed AFTER the computation has been done:

  • Compute the aggregate functions call
  • Filter the rows using the HAVING clause

This is why the HAVING clause can have aggregate functions while the WHERE clause can’t.

You’ve just learned how to fix the Invalid use of group function error. Nice work! 👍

27 июля 2009 г.

MySQL

Не возможно использовать для обновления таблицу, в которой производишь выборку

mysql-logo

Понадобилось ежесуточно высчитывать размер шрифта для оформления вывода жанров на Кинсбурге. И столкнулся с проблемой, что нельзя выбирать данные из таблицы, которая участвует в обновлении данных.

Вот примеры запросов

Пробуем в лоб:

update `categories` set `size` = (`count` / ((max(`count`) - min(`count`)) / 10));
ERROR 1111 (HY000): Invalid use of group function

Попробуем вложенный селект:

update `categories` set `size` = (select (`count` / ((max(`count`) - min(`count`)) / 10)) from `categories`);
ERROR 1093 (HY000): You can't specify target table 'categories' for update in FROM clause

Попробуем жоин:

update `categories` as `c1` 
JOIN `categories` as `c2` 
using(`category_id`) 
set `c1`.`size` = (`c2`.`count` / ((max(`c2`.`count`) - min(`c2`.`count`)) / 10));

ERROR 1111 (HY000): Invalid use of group function

По отдельности все работает

Выводим «размер шрифта»:

select (`count` / ((max(`count`) - min(`count`)) / 10)) from `categories`;
+--------------------------------------------------------+
| (`count` / ((max(`count`) - min(`count`)) / 10))     |
+--------------------------------------------------------+
|                                             3.47826087 |
+--------------------------------------------------------+
1 row in set (0.00 sec)

Обновляем поле с размером шрифта:

update `categories` set `size` = 3.47826087;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 21  Changed: 0  Warnings: 0

Решение

Погуглив, и поломав голову с disc’ом, я пришел к следующему решению, представленное ниже.

Я решил выделить вычисление процента в переменную @percent, далее создал вьюху для таблицы «categories» и жойню таблицу с вьюхой:

-- создаем коэффициент деления
set @percent = (select (max(`count`) - min(`count`)) / 10 from `categories`);

-- создаем вьюху
create view `categories_view` as select `category_id`, `count` from `categories`;

-- жойним таблицу и вьюху, обновляя данные
update `categories` as `c`
join `categories_view` as `cv`
using(`category_id`)
set `c`.`size` = `cv`.`count` / @percent;

Вот и все, приятного манокурения :)

UPD: Создадим процедуру и евент для этого события

/* Создаем вьюху и процедуру для установки размеров шрифта */
use kinsburg;

/* создаем вьюху */
CREATE VIEW `categories_view` AS SELECT `category_id`, `count` FROM `categories`;

/* создаем процедуру */
delimiter //
DROP PROCEDURE IF EXISTS `updateCategorySize`//
CREATE PROCEDURE `updateCategorySize` ()
BEGIN
    /* создаем коэффициент деления */
    SET @percent = (SELECT (max(`count`) - min(`count`)) / 10 FROM `categories`);
    /* жойним таблицу и вьюху, обновляя данные */
    UPDATE `categories` AS `c` JOIN `categories_view` AS `cv` USING(`category_id`) SET `c`.`size` = `cv`.`count` / @percent;
END//
delimiter ;

/* создаем евент для вызова процедуры раз в сутки */
CREATE
    DEFINER = kinsburg@localhost
    EVENT `updateCategorySizeEvent`
    ON SCHEDULE
      EVERY 1 DAY
    DO
      CALL updateCategorySize; 

To correctly use aggregate function with where clause in MySQL, the following is the syntax −

select *from yourTableName
where yourColumnName > (select AVG(yourColumnName) from yourTableName);

To understand the above concept, let us create a table. The query to create a table is as follows −

mysql> create table EmployeeInformation
   -> (
   -> EmployeeId int,
   -> EmployeeName varchar(20),
   -> EmployeeSalary int,
   -> EmployeeDateOfBirth datetime
   -> );
Query OK, 0 rows affected (1.08 sec)

Now you can insert some records in the table using insert command. The query is as follows −

mysql> insert into EmployeeInformation values(101,'John',5510,'1995-01-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into EmployeeInformation values(102,'Carol',5600,'1992-03-25');
Query OK, 1 row affected (0.56 sec)
mysql> insert into EmployeeInformation values(103,'Mike',5680,'1991-12-25');
Query OK, 1 row affected (0.14 sec)
mysql> insert into EmployeeInformation values(104,'David',6000,'1991-12-25');
Query OK, 1 row affected (0.23 sec)
mysql> insert into EmployeeInformation values(105,'Bob',7500,'1993-11-26');
Query OK, 1 row affected (0.16 sec)

Display all records from the table using select statement. The query is as follows −

mysql> select *from EmployeeInformation;

The following is the output −

+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
|        101 | John         |           5510 | 1995-01-21 00:00:00 |
|        102 | Carol        |           5600 | 1992-03-25 00:00:00 |
|        103 | Mike         |           5680 | 1991-12-25 00:00:00 |
|        104 | David        |           6000 | 1991-12-25 00:00:00 |
|        105 | Bob          |           7500 | 1993-11-26 00:00:00 |
+------------+--------------+----------------+---------------------+
5 rows in set (0.00 sec)

Here is the correct way to use aggregate with where clause. The query is as follows −

mysql> select *from EmployeeInformation
   -> where EmployeeSalary > (select AVG(EmployeeSalary) from EmployeeInformation);

The following is the output −

+------------+--------------+----------------+---------------------+
| EmployeeId | EmployeeName | EmployeeSalary | EmployeeDateOfBirth |
+------------+--------------+----------------+---------------------+
|        105 | Bob          |           7500 | 1993-11-26 00:00:00 |
+------------+--------------+----------------+---------------------+
1 row in set (0.04 sec)

Symptoms

Using MySQL 4.x, the following appears in the atlassian-confluence.log file:


ERROR [http-1026-3] [atlassian.confluence.servlet.ConfluenceServletDispatcher] sendError Could not execute action
 -- referer: http://wiki.somedomain.com/confluence/dashboard.action | url: /confluence/dosearchsite.action | userName: admin
java.lang.RuntimeException: Error rendering template for decorator root
	(snipped stack trace)
Caused by: java.lang.RuntimeException: Error rendering template for decorator search
	(snipped stack trace)
Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getRelatedLabels' in  class com.atlassian.confluence.search.actions.SearchSiteAction threw exception org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Could not execute query; uncategorized SQLException for SQL []; SQL state [S1000]; error code [1111]; General error,  message from server: "Invalid use of group function"; nested exception is java.sql.SQLException: General error,  message from server: "Invalid use of group function" @ /search/searchpanel.vm[46,14]
	(snipped stack trace)
Caused by: org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Could not execute query; uncategorized SQLException for SQL []; SQL state [S1000]; error code [1111]; General error,  message from server: "Invalid use of group function"; nested exception is java.sql.SQLException: General error,  message from server: "Invalid use of group function"
	(snipped stack trace)
Caused by: java.sql.SQLException: General error,  message from server: "Invalid use of group function"
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1905)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1109)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1203)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2090)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1496)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
	at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:89)
	at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:880)
	at net.sf.hibernate.loader.Loader.doQuery(Loader.java:273)
	at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:138)
	at net.sf.hibernate.loader.Loader.doList(Loader.java:1063)
	at net.sf.hibernate.loader.Loader.list(Loader.java:1054)
	at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:854)
	at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1554)
	at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:49)
	at com.atlassian.confluence.labels.persistence.dao.hibernate.HibernateLabelDao$3.doInHibernate(HibernateLabelDao.java:378)
	at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:370)
	... 195 more

Cause

Confluence 2.9 and later no longer supports MySQL 4.x. Check the List Of Supported Databases.

Resolution

Upgrade to MySQL 5.0.28+.

There is a posted workaround, but upgrade is the supported resolution pattern. You may have limited success with the workaround, which is not supported. See Workaround For Enabling MySQL 4.1.x with Confluence 2.10.


Last modified on Mar 30, 2016

Related content

  • No related content found

Я работаю над созданием SQL-отчета в таблице answers:

id | created_at
1  | 2018-03-02 18:05:56
2  | 2018-04-02 18:05:56
3  | 2018-04-02 18:05:56
4  | 2018-05-02 18:05:56
5  | 2018-06-02 18:05:56

И выход:

weeks_ago | record_count (# of rows per weekly cohort) | growth (%)
-4        | 21                                         |  22%
-3        | 22                                         | -12%
-2        | 32                                         |   2%
-1        |  2                                         |  20%
 0        | 31                                         |   0%

Мой запрос в настоящее время заблуждается:

1111 - Invalid use of group function

Что я здесь делаю неправильно?

SELECT  floor(datediff(f.created_at, curdate()) / 7) AS weeks_ago,
                count(DISTINCT f.id) AS "New Records in Cohort",
                100 * (count(*) - lag(count(*), 1) over (order by f.created_at)) / lag(count(*), 1) over (order by f.created_at) || '%' as growth
FROM answers f
WHERE f.completed_at IS NOT NULL
GROUP BY weeks_ago
HAVING count(*) > 1;

21 сен. 2018, в 00:03

Поделиться

Источник

2 ответа

Я думаю, вы хотите найти количество запущенных строк, исключая текущую строку. Я думаю, что вы можете LAG функцию LAG следующим образом:

SELECT
    COUNT(*) OVER (ORDER BY f.created_at ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) x, -- running count before current row
    COUNT(*) OVER (ORDER BY f.created_at) y -- running count including current row

Вы можете разделить и размножить все, что хотите.


Нету. вам просто нужно отделить GROUP BY и LAG OVER:

WITH cte AS (
    SELECT
        FLOOR(DATEDIFF(created_at, CURDATE()) / 7) AS weeks_ago,
        COUNT(DISTINCT id) AS new_records
    FROM answers
    WHERE 1 = 1 -- todo: change this
    GROUP BY weeks_ago
    HAVING 1 = 1 -- todo: change this
)
SELECT
    cte.*,
    100 * (
        new_records - LAG(new_records) OVER (ORDER BY weeks_ago)
    ) / LAG(new_records) OVER (ORDER BY weeks_ago) AS percent_increase
FROM cte

скрипка

Salman A
20 сен. 2018, в 20:04

Поделиться

Вы не можете использовать lag содержащую функцию агрегации COUNT, потому что она недействительна при использовании функции агрегата, содержащей агрегированную функцию.

вы можете попытаться использовать подзапрос, чтобы сделать это.

SELECT weeks_ago,
       NewRecords "New Records in Cohort",
      100 * (cnt - lag(cnt, 1) over (order by created_at)) / lag(cnt, 1) over (order by created_at) || '%' as growth
FROM (
    SELECT floor(datediff(f.created_at, curdate()) / 7) AS weeks_ago, 
           COUNT(*) over(partition by weeks_ago order by weeks_ago) cnt,
           count(DISTINCT f.id) NewRecords,
           f.created_at
    FROM answers f
) t1

D-Shih
20 сен. 2018, в 19:59

Поделиться

Ещё вопросы

  • 1Проблема в setOnclickListener
  • 1JS Promise wait для обновления токена
  • 0Неверное значение из DDX_CBIndex ()
  • 0MySQL условная вставка с вставкой .. выберите
  • 1Что на самом деле делает ключевое слово «in», когда используется для проверки, содержит ли последовательность (список, кортеж, строка и т. Д.) Значение. Цикл пока не найдешь значение?
  • 1Создание объекта с помощью отражения с анонимным типом
  • 0Ограниченный запуск onFulfilled callback для обещания, даже если обещание отклонено
  • 1Проверка содержимого EditText, как только пользователь вводит данные
  • 0WinAPI: найти каталог собственного исполняемого при изменении местоположения
  • 0Выражение регулярного выражения, похожее на шорткоды WordPress
  • 0Шаблон получения контейнера в качестве аргумента
  • 0как скрыть информацию о странице из всплывающего окна с подтверждением (phonegap, jquery, iPhone)
  • 0Как мне заполнить значение первичного ключа через форму и запрос php?
  • 0Включение содержимого страницы PHP в другой
  • 0хотите получить имя файла и его путь, который был загружен с помощью плагина jquery
  • 1`Не файл WAVE — без заголовка RIFF` блокирует файл
  • 1python для эффективного использования результата функции в операторе if
  • 1FileNotFoundException при попытке прочитать файл, который я написал
  • 0коробка opengl с резиновой прокладкой не отображается
  • 0Показать изображение с помощью onMouseOver, причем изображение находится за пределами li-тега
  • 1Как отправить данные с асинхронного сервера сокетов Python в подпроцесс?
  • 0Служба AngularJS PUT в плоский файл JSON
  • 1Почему nullpointerexception при разборе xml в приложении для Android?
  • 1Ответ с родительским классом в SPRING REST
  • 0Проверка JQuery — Назначение правил в качестве переменной
  • 1Не удалось загрузить файл или сборку WPFToolkit
  • 0Найти самую длинную подстроку в строке
  • 1«With io.open» автоматически закрывает файл?
  • 1как вызывать Common Lisp коды из метода JSCL
  • 0Проверка углового шаблона телефона
  • 0Решение для MySQL время от времени с использованием 1 столбца
  • 0Как получить обложку альбома из музыкального файла с помощью PHP?
  • 0построение меню в HTML с содержанием справа
  • 1Как разрешить каскадное удаление в Hibernate?
  • 0Как я могу настроить ответы на сообщения в теме, основанной на минимальной теме?
  • 0curlopt_postfields $ params ‘to’ как массив?
  • 1Javascript: «истинные» значения для непустых строк
  • 1отключить вспышку в браузере селена
  • 1Исключить приложение из Launcher
  • 0Ежемесячный повтор с PHP
  • 0DOM не обновляется при запросе $ http POST со стеком MEAN
  • 1Превышение времени ожидания запроса на обработку
  • 1Ошибка установки с правами администратора
  • 1JS обещают разоблачающий конструктор в YDKJS
  • 0как использовать контроллер $ scope в шаблоне директивы
  • 1Как удалить предметы из комбинированного магазина
  • 0Метод, вызывающий статический одноэлементный экземпляр для вызова другого метода
  • 0Сброс цикла HTML <audio> с помощью .keyup () в jquery
  • 0Вывод цикла из массива garbge после окончания цикла
  • 1ошибка: <идентификатор> ожидаемый нм = «Сэм»;

Сообщество Overcoder

Понравилась статья? Поделить с друзьями:
  • Error 111 tunnel connection failed
  • Error 1109 unknown table applicant in multi delete
  • Error 11021 exmo
  • Error 1101 cloudflare
  • Error 11001 proxifier