Ссылка на таблицу в родительском запросе из подзапроса

Я хочу составить список пользователей и извлечь список контактов, выполненных каждым из них, сгруппированных по типу элемента, с которым вы связались, в одном поле. Что-то вроде этого:

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 на последней фазе выполнения запроса. Надеюсь, я объяснил.

Спасибо!


person Emilio Nicolás    schedule 04.07.2014    source источник
comment
Можете ли вы предоставить полный запрос и некоторую информацию об объединениях, я думаю, это можно сделать без использования подзапроса.   -  person CrashOverload    schedule 04.07.2014


Ответы (1)


Попробуйте переместить свой подзапрос в присоединяемую часть:

    SELECT
    u.id,
    u.name,
     table_tmp.user_cont as user_contact_views,
    , ... -- Lots of fields
    FROM user u
    INNER JOIN
     (select group_concat(type_id_n_contacts) as user_cont, sub_user_id
     from (select CONCAT(item_type_id, '=', count(*)) type_id_n_contacts, ic.user_id as sub_user_id
            from item_contact ic
            group by item_type_id) sq_type_id_n_contacts
    ) as table_tmp ON table_tmp.sub_user_id = u.id
    INNER JOIN -- Other tables, field, where and so on ignored
    WHERE ...
    GROUP BY ...
    ORDER BY ...;
person Giulio De Marco    schedule 04.07.2014
comment
Спасибо, Джуло, но ваш запрос не работает. Тем не менее, вы имеете в виду, что это СОЕДИНЕНИЕ: ЛЕВОЕ СОЕДИНЕНИЕ (выберите group_concat (type_id_n_contacts) как user_cont, sub_user_id из (выберите CONCAT (item_type_id, '=', count (*)) type_id_n_contacts, ic.user_id как sub_user_id из item_contact_id group by item_contact_id group by , user_id) sq_type_id_n_contacts группа по sub_user_id) как table_tmp ON table_tmp.sub_user_id = u.id - person Emilio Nicolás; 04.07.2014
comment
Да, я имею в виду присоединение, которое вы вставили в свой комментарий. Очевидно, я не смог попробовать запрос, я просто написал пример :) - person Giulio De Marco; 04.07.2014
comment
Это нечитабельно, но я понимаю вашу идею. Я могу заставить запрос работать, создав временную таблицу со всеми предварительно вычисленными идентификаторами users_id, связанными со строкой счетчика. Я знаю, что, однако, слишком много полей, чтобы сделать это с таблицей отверстий пользователей и впоследствии сделать соединение неиндексированным. Вот почему я хочу, чтобы MySQL выполнял подзапрос только с уже отфильтрованными user_ids и ограниченными WHERE и LIMIT на последней фазе выполнения запроса. Надеюсь, я объяснил. - person Emilio Nicolás; 04.07.2014
comment
Наличие переменной MySQL со значением u.id может помочь в подзапросе с ic.user_id = @user_id, но я не могу этого сделать! :-( - person Emilio Nicolás; 04.07.2014
comment
Да, я понимаю вашу проблему. Попробуйте поставить условие WHERE ic.user_id = u.id в подпункте SELECT FROM item_contact ic ... моего примера. Может, это сработает - person Giulio De Marco; 04.07.2014