2010-07-31 6 views
0

"where 절 '에서 알 수없는 열't1.product_id '가 발생하는 하위 쿼리에서 하위 쿼리를 수행해야합니다. 제 예제에서는 7 번 줄에 있습니다. 이 문제를 해결하는 방법?하위 쿼리 하위 쿼리로 인해 "알 수없는 열"

SELECT *,product_id id, 
    (SELECT GROUP_CONCAT (value ORDER By `order` ASC SEPARATOR ', ') 
    FROM (
     SELECT `order`,value 
     FROM slud_data 
     LEFT JOIN slud_types ON slud_types.type_id=slud_data.type_id 
     WHERE slud_data.product_id = t1.product_id 
      AND value!='' AND display=0 
     LIMIT 3 
    ) tmp) text 
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) AND activated=1 
    ORDER BY t1.date DESC 

이 질문은 LIMIT ignored in query with GROUP_CONCAT

+0

ORDER BY 절이 없으면 LIMIT은 (일부 사람의 경우) 예측할 수없는 테이블 인덱스의 기본 구조에 의존합니다. – Strawberry

답변

2

사용 파생 테이블/인라인 뷰에서 계속하고, 테이블 별명 :

SELECT product_id AS id, 
     GROUP_CONCAT (y.value ORDER BY y.`order`) 
    FROM slud_products t1 
    JOIN (SELECT sd.product_id, 
       sd.value, 
       sd.`order` 
      FROM SLUD_DATA sd 
     LEFT JOIN slud_types ON slud_types.type_id = slud_data.type_id 
      WHERE value! = '' 
      AND display = 0) y ON y.product_id = t1.product_id 
           AND y.order <= 3 
    WHERE now() < DATE_ADD(date,INTERVAL +ttl DAY) 
    AND activated = 1 
GROUP BY product_id 
ORDER BY t1.date DESC 
+0

안녕하세요. 원본 쿼리의 "LIMIT 3"절이 여기서 어떻게 처리되는지 궁금하십니까? 'order'가 sequental 필드가 아니거나 0을 기반으로하지 않는다면 어떻게 될까요? – Dfr

+0

@Dfr :'AND y.order <= 3 '은 그룹 단위 제한입니다. OP가 이것을 대답으로 표시했다면, 'order'가 숫자라고 가정하는 것이 안전합니다 ... –

4

나는 더 편안 이상 2 쿼리에서 변수를 사용하여 발견 딥을 선택합니다.

SELECT *,@product := product_id id, 
    (SELECT GROUP_CONCAT (value ORDER By `order` ASC SEPARATOR ', ') 
    FROM (
     SELECT `order`,value 
     FROM slud_data 
     LEFT JOIN slud_types ON slud_types.type_id=slud_data.type_id 
     WHERE slud_data.product_id = @product 
      AND value!='' AND display=0 
     LIMIT 3 
    ) tmp) text 
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) AND activated=1 
    ORDER BY t1.date DESC 
+0

이것은 모든 버전의 MySQL에서 작동하지 않습니다. –