У меня есть две таблицы, которые выглядят так:

users:
    id int unsigned auto_increment,
    primary key(id),
    [...]

product:
    id int unsigned auto_increment,
    seller id int unsigned auto_increment,
    primary key(id),
    foreign key(seller) references users(id)
    [...]

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

select u.id, [...], count(p.id) from users u, products p where p.seller=u.id and [...]

Это, однако, дает мне следующую ошибку:

ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db.u.id'; this is incompatible with sql_mode=only_full_group_by

Каков будет правильный способ достижения желаемого результата? И почему это не работает?

2
Addi 4 Сен 2017 в 22:14

4 ответа

Лучший ответ

Вы агрегируете данные (count(p.id)). Вы не используете GROUP BY для получения агрегатов по какой-либо группе, поэтому вы получаете только одну строку результатов с агрегатами.

Но вы также выбираете u.id. Который из? В таблице много разных u.id, но вы получите только одну строку результатов. СУБД ожидает, что вы сообщите ей, какую вы хотите, например, MAX(u.id) .

Если вы хотите выбрать пользовательские данные, выберите из users. Если вы хотите получить количество продуктов, выберите их в подзапросе (что проще всего сделать в предложении select, но также можно сделать в предложении from).

select
  u.*,
  (select count(*) from product p where p.seller = u.id) as number_of_products
from users u;
1
Thorsten Kettner 4 Сен 2017 в 21:34

Используйте ANY_VALUE для неагрегированных столбцов. В вашем примере неагрегированным столбцом был db.u.id (см. Сообщение об ошибке). Итак, вы должны использовать:

select ANY_VALUE(u.id), [...], count(p.id) 
from users u, products p 
where p.seller=u.id and [...]
group by [...]

Подробнее здесь.

0
Italo Borssatto 7 Мар 2020 в 18:18

Вот правильный запрос, который вы можете попробовать:

< Сильный > ASCII

SELECT u.id, [...], COUNT(p.id) FROM users u JOIN products p ON u.id=p.seller GROUP BY p.seller;

< Сильный > NON - ASCII

SELECT u.id, [...], COUNT(p.id) FROM users u, products p WHERE u.id=p.seller GROUP BY p.seller;
0
Jignesh M. Khatri 4 Сен 2017 в 19:19

Коррелированный подзапрос может быть самым простым подходом:

select u.*,
       (select count(*) from products p where p.seller = u.id) as num_products
from users u;
1
Gordon Linoff 4 Сен 2017 в 19:21