MYSQL (MariaDB) - Неправильное использование групповой функции - PullRequest
0 голосов
/ 29 января 2020

У меня есть две таблицы с именами addresses и house_sales

адреса

+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| id                | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| house_number_name | varchar(150)     | NO   |     | NULL    |                |
| address_line1     | varchar(150)     | NO   | MUL | NULL    |                |
| address_line2     | varchar(150)     | YES  |     | NULL    |                |
| address_line3     | varchar(150)     | YES  | MUL | NULL    |                |
| town_city         | varchar(150)     | NO   | MUL | NULL    |                |
| district          | varchar(150)     | YES  | MUL | NULL    |                |
| county            | varchar(150)     | YES  | MUL | NULL    |                |
| post_code         | varchar(8)       | NO   | MUL | NULL    |                |
| updated_at        | datetime         | NO   |     | NULL    |                |
| created_at        | datetime         | NO   |     | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+

house_sales

+---------------+------------------------------------------------------------+------+-----+---------+----------------+
| Field         | Type                                                       | Null | Key | Default | Extra          |
+---------------+------------------------------------------------------------+------+-----+---------+----------------+
| id            | int(11) unsigned                                           | NO   | PRI | NULL    | auto_increment |
| address_id    | int(11) unsigned                                           | NO   | MUL | NULL    |                |
| price         | int(11) unsigned                                           | NO   | MUL | NULL    |                |
| date          | datetime                                                   | NO   | MUL | NULL    |                |
| updated_at    | datetime                                                   | NO   |     | NULL    |                |
| created_at    | datetime                                                   | NO   |     | NULL    |                |
+---------------+------------------------------------------------------------+------+-----+---------+----------------+

Я пытаюсь выбрать все адреса, сгруппированные по address_line1, а затем получить среднюю цену для этой улицы. Запрос работает, но я хочу выбрать только несколько домов на одной улице. Однако, когда я добавляю AND count(*) > 1, я получаю ошибку «Недопустимое использование групповой функции» . Ниже приведен запрос

SELECT count(*) as total_sales, avg(price) as average_price, `address_line1`, `town_city`
FROM `house_sales` `hs`
LEFT JOIN `addresses` `a` ON `hs`.`address_id` = `a`.`id`
WHERE `town_city` = 'London'
AND count(*) > 1
GROUP BY `address_line1`
ORDER BY `average_price` desc

Я не уверен, почему я получаю эту ошибку. Я пробовал подзапрос, чтобы я мог использовать HAVING, но у меня не получилось. Любая помощь или указатели будут оценены

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вам нужно предложение having для фильтрации по агрегированному выражению:

SELECT count(*) as total_sales, avg(price) as average_price, `address_line1`, `town_city`
FROM `house_sales` `hs`
LEFT JOIN `addresses` `a` ON `hs`.`address_id` = `a`.`id`
WHERE `town_city` = 'London'
GROUP BY `address_line1`, `town_city`
HAVING  count(*) > 1
ORDER BY `average_price` desc

MySQL расширяет стандарт SQL, позволяя использовать псевдонимы в предложении having, поэтому вы также можно сделать:

having total_sales > 1

Примечания:

  • , как прокомментировал jarlh, это хорошая практика, чтобы квалифицировать (префикс) все имена столбцов с таблицей, которую они принадлежат

  • также рекомендуется помещать все неагрегированные столбцы в предложение group by (я добавил town_city, которого не было в исходном запросе) - новее версии MySQL по умолчанию не допускают этого

  • цитирование всех идентификаторов обычно не требуется (если они не содержат специальных символов)

1 голос
/ 29 января 2020

Есть два способа go здесь. Один из них - добавить town_city в список GROUP BY:

SELECT
    address_line1,
    town_city,
    COUNT(*) AS total_sales,
    AVG(price) AS average_price
FROM house_sales hs
LEFT JOIN addresses a ON hs.address_id = a.id
WHERE town_city = 'London'
GROUP BY address_line1, town_city
HAVING COUNT(*) > 1
ORDER BY average_price DESC;

Другой вариант - просто сохранить текущий запрос, но удалить town_city из списка выбора, поскольку вы ограничиваетесь только Лондон в любом случае.

SELECT
    address_line1,
    COUNT(*) AS total_sales,
    AVG(price) AS average_price
FROM house_sales hs
LEFT JOIN addresses a ON hs.address_id = a.id
WHERE town_city = 'London'
GROUP BY address_line1
HAVING COUNT(*) > 1
ORDER BY average_price DESC;
...