1

사용자 목록을 수행하고 각 필드에서 수행 한 연락처 목록을 한 필드에서 연락하는 항목 유형별로 그룹화합니다. 이런 식으로 뭔가 :하위 쿼리의 상위 쿼리 테이블 참조

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 사용할 수 없습니다 내가 너희 경우 감사하겠습니다있다 사람들은 그것을 해결하기 위해 어떤 작업 arround 알아요. MySQL 변수는 어떻습니까? u.id의 값을 subsubquey의 변수로 가져 와서 ic.user_id = @user_id를 사용하는 방법?

중요 사항 : 필자는 필드 섹션에서 하위 쿼리를 사용해야합니다. count 문자열과 관련된 모든 미리 계산 된 users_id를 사용하여 JOIN에 임시 테이블을 작성하여 쿼리를 작동시킬 수 있습니다 (Giulio 응답 참조). 그러나 사용자의 전체 테이블을 사용하고 나중에 색인을 생성하지 않기 위해 너무 많은 필드가 있습니다. 그래서 MySQL은 쿼리 실행의 마지막 단계에서 WHERE 및 LIMIT에 의해 이미 필터링되고 제한된 user_ids로 하위 쿼리를 수행하기를 원합니다. 나는 나 자신을 설명하기를 바란다.

감사합니다.

+0

당신이 완전한 쿼리 및 조인에 대한 정보를 제공 할 수 있습니다, 나는이 하위 쿼리를 사용하지 않고 할 수 있다고 생각합니다. – CrashOverload

답변

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

Giulo에게 감사하지만 쿼리가 작동하지 않습니다. 그럼에도 불구하고, 당신이 말은이 가입입니다 : LEFT이 (user_cont로 GROUP_CONCAT (type_id_n_contacts)를 선택이 (CONCAT (item_type_id을 선택 '=', item_contact에서)) sub_user_id 등 type_id_n_contacts, ic.user_id을 (계산 *에서 을 sub_user_id 가입 ic 그룹 by item_type_id, user_id) sq_type_id_n_contacts \t group by sub_user_id) table_tmp ON table_tmp.sub_user_id = u.id –

+0

예, 내 의견에 붙여 넣은 참여를 의미합니다. 분명히 내가 쿼리를 시도 할 수 없었다, 나는 단지 예제를 썼다. –

+0

그것은 읽을 수 없다. 그러나 나는 당신의 아이디어를 얻는다. 카운트 문자열과 관련된 모든 미리 계산 된 users_id를 사용하여 임시 테이블을 생성하여 쿼리를 작동하게 만들 수 있습니다. 그러나 사용자의 구멍 테이블을 가지고 너무 많은 필드가있어 나중에 인덱스를 만들지 않는 것이 좋다는 것을 알고 있습니다. 그래서 내가 MySQL이 쿼리 필터링의 마지막 단계에서 WHERE와 LIMIT에 의해 이미 필터링되고 제한된 user_ids로만 서브 쿼리를 수행하기를 원한다. 나는 나 자신을 설명하기를 바란다. –

관련 문제