2009-10-13 5 views
0

어떤 이유로 든 MySQL은 뷰에서 하위 쿼리를 지원하지 않습니다. 나는 forseeable 미래를 위해 MySQL을 사용하여 붙어있어 그리고 EAV 스타일의 테이블에서 더 읽기 쉬운 형식으로 데이터를 집계하기 위해 뷰를 작성해야합니다. 뷰 자체는 Ruby on Rails 기반 애플리케이션의 모델 역할을 할 것이다 (읽기 전용이므로 뷰를 사용하는 것이 안전하다).이 복잡한 SQL 쿼리를 다시 작성하여 MySQL 뷰에 대한 하위 쿼리를 사용하지 않도록 할 수 있습니까?

내가이 동물을 개조하여보기를 만들 수 있다면 어떻게 할 수 있습니까? 내가 일련의 미니보기를 만든 다음 하나의 마스터보기 (하나의보기로 모든 경우를 다룰 수 있음)를 만들 수만 있다면 다른 방법이 있는지 궁금합니다.

다음은 괴물입니다. 모든 필드는 선택 사항이기 때문에 외부의 많은 수는 조인 그러나 나는 모든 열을 표시해야합니다

select ls.subscriberid as id, l.name as list_name, 
    ifnull(cfn.first_name, '') as first_name, 
    ifnull(cln.last_name, '') as last_name, 
    ifnull(ce.email_address, '') as email_address, 
    ifnull(cm.mobile_phone, '') as mobile_phone 
from (
    select ls.subscriberid, ifnull(s.data, '') as first_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 2 /* First Name */ 
) cfn 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as last_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 3 /* Last Name */ 
) cln on cfn.subscriberid = cln.subscriberid 
right outer join (
    select ls.subscriberid, ls.emailaddress as email_address 
    from list_subscribers ls 
) ce on ce.subscriberid = cfn.subscriberid 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as mobile_phone 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 81 /* Mobile Phone */ 
) cm on cm.subscriberid = cfn.subscriberid 
right outer join list_subscribers ls on ls.subscriberid = cfn.subscriberid 
inner join lists l on ls.listid = l.listid 

답변

0

이 하나를 시도해보십시오 :

작업 표시
SELECT ls.subscriberid as id, l.name as list_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 2 
           THEN s.data 
           ELSE NULL 
          END), '') as first_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 3 
           THEN s.data 
           ELSE NULL 
          END), '') as last_name, 
     ifnull(ls.email_address, '') as email_address, 
     ifnull(group_concat(CASE WHEN s.fieldId = 81 
           THEN s.data 
           ELSE NULL 
          END), '') as mobile_phone 
    FROM list_subscribers ls 
INNER JOIN lists l on ls.listid = l.listid 
LEFT JOIN subscribers_data s on ls.subscriberid = s.subscriberid 
    GROUP BY ls.subscriberid, l.name, ls.email_address 
+0

. 무리 감사!! –