MySQL присоединяется с проблемой подзапросов - PullRequest
0 голосов
/ 08 октября 2018

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

table1

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

table2

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 - Неправильное использование групповой функции

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

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

Неизвестный столбец 'table3.fans' в 'списке полей'

1 Ответ

0 голосов
/ 08 октября 2018

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

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

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

 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 

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

...