来自子子查询的父查询中的表的引用

时间:2014-07-04 12:16:49

标签: mysql subquery correlated-subquery mysql-dependent-subquery

我想在一个字段中执行用户列表并提取每个用户完成的联系人列表,按联系项目类型分组。像这样:

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的值获取到sububquey中的变量以使用ic.user_id = @user_id?

重要说明:我必须在字段部分中使用子查询。我可以通过在JOIN中创建临时表来使查询工作,其中所有预先计算的users_id与计数字符串相关(请参阅Giulio答案)。我知道,但是对于整个用户表来说,有太多的字段要做,并且之后进行无索引的连接。这就是为什么我希望MySQL在查询执行的最后阶段只使用已经过滤并受WHERE和LIMIT限制的user_ids来执行子查询。我希望自己解释一下。

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试在连接部分中移动子查询:

    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 ...;