Я хочу составить список пользователей и извлечь список контактов, выполненных каждым из них, сгруппированных по типу элемента, с которым вы связались, в одном поле. Что-то вроде этого:
user_id, user_name, user_contact_views
100, john, 'a=21,b=22,c=3'
101, mary, 'a=53'
102, jack, 'b=13,c=5'
У меня этот запрос почти рабочий
SELECT
u.id user_id,
u.name user_name,
(select group_concat(type_id_n_contacts)
from (select CONCAT(item_type_id, '=', count(*)) type_id_n_contacts
from item_contact ic
where ic.user_id = u.id
group by item_type_id) sq_type_id_n_contacts
) as user_contact_views
, ... -- Lots of fields
FROM user u
INNER JOIN -- Other tables, field, where and so on ignored
WHERE ...
ORDER BY ...
LIMIT ...;
Но я получаю
Error Code: 1054. Unknown column 'u.id' in 'where clause'
Я не могу использовать u.id из вложенного запроса, и я был бы признателен, если бы вы, ребята, знали, как его решить. А как насчет переменных MySQL? Как передать значение u.id переменной в подподразделе, чтобы использовать ic.user_id = @user_id?
Важное примечание: я должен использовать подзапрос в разделе полей. Я могу заставить запрос работать, создав временную таблицу в JOIN со всеми предварительно рассчитанными users_id, связанными со строкой счетчика (см. Ответ Джулио). Я знаю, что, однако, слишком много полей, чтобы сделать это со всей таблицей пользователей и потом сделать соединение неиндексированным. Вот почему я хочу, чтобы MySQL выполнял подзапрос только с уже отфильтрованными user_ids и ограниченными WHERE и LIMIT на последней фазе выполнения запроса. Надеюсь, я объяснил.
Спасибо!