Mysql соединяется с проблемой подзапросов

У меня проблема с объединением sql join с группой и подзапросом для выбора максимального значения.

Таблица 1

user_id user_name
1   x
2   t
3   y
4   i
5   o

Таблица 2

user_id game_id
1   soccer
2   soccer
2   pool
2   basketball
5   swimming

table3

user_id fans    date
1   54805   2018-10-05
2   10005   2018-10-05
2   10023   2018-10-03
3   175 2018-10-05
4   1542    2018-10-05

При выполнении этого запроса, который группирует все game_ids по user_ids, у меня есть успех:

SELECT table1.user_id, table1.user_name, group_concat(table2.game_id) as games
FROM (table1
LEFT JOIN table2 on table2.user_id = table1.user_id) 
group by table1.user_id

Но при попытке объединить подзапрос, чтобы вернуть последний номер фанатов:

SELECT table1.user_id, table1.user_name, group_concat(table2.game_id) as games, table3.fans 
FROM ((table1
LEFT JOIN table2 on table2.user_id = table1.user_id) 
INNER JOIN (SELECT * FROM table3 WHERE MAX(update_time) ORDER BY update_time LIMIT 1) AS fans ON table1.user_id = table3.user_id) 
group by table1.user_id

У меня проблема с групповой функцией:

#1111 - Invalid use of group function

Редактировать:

Исправлена ​​проблема №1111, изменив WHERE на HAVING, но мой запрос по-прежнему не работает, поскольку MYSQL сообщает следующее:

Unknown column 'table3.fans' in 'field list'

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
42
1

Ответы 1

Если вы используете функцию агрегирования, вы должны объявить в предложении group by все столбцы, не участвующие в функции агрегирования.

Вы используете функцию агрегирования MAX(update_time) в предложении where, и это вызывает ошибку invalid use of group function.

использование агрегированной функции в where не разрешено, в конечном итоге вы можете отфильтровать этот результат с помощью предложения Have.

 SELECT table1.user_id
    , table1.user_name
    , group_concat(table2.game_id) as games
    , fans.my_res 
FROM table1
INNER JOIN (
    SELECT user_id, MAX(update_time)  my_res FROM table3 
    group by user_id
    ORDER BY  my_res DESC LIMIT 1
) AS fans ON table1.user_id = fans.user_id 
LEFT JOIN table2 on table2.user_id = table1.user_id 
group by table1.user_id,  table1.user_name, fans.my_res 

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

Спасибо за подробный ответ. однако отправленный вами запрос также возвращает ошибку: # 1055 - Выражение № 2 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'db.table3.fans', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by. Кроме того, я обновил свои псевдонимы в запросе.

mele 08.10.2018 21:39

не могли бы вы объяснить, что вы указали в "my_res" в "ORDER BY update_time my_res", поскольку он возвращает синтаксическую ошибку

mele 08.10.2018 21:51

ответ обновлен .. удалено неиспользуемое update_time (с использованием псевдонима my_res)

ScaisEdge 08.10.2018 21:59

теперь возвращает неизвестный столбец table3.fans в заявлении группы :)

mele 08.10.2018 22:29

Другие вопросы по теме