2010-07-31 8 views
9

두 번째 테이블에서 일부 행을 선택하고 쉼표로 구분 된 문자열로 연결해야합니다. 한 가지 문제를 제외하고 쿼리가 잘 작동합니다. 항상 모든 행을 선택하고 LIMIT를 무시합니다.GROUP_CONCAT을 사용하여 쿼리에서 LIMIT이 무시되었습니다.

이 그 문자열을 가져옵니다 무시하고 내 쿼리의 일부입니다 LIMIT :

select 
    group_concat(value order by `order` asc SEPARATOR ', ') 
from slud_data 
    left join slud_types on slud_types.type_id=slud_data.type_id 
where slud_data.product_id=18 and value!='' and display=0 limit 3; 


// Result: 
+---------------------------------------------------------+ 
| group_concat(value order by `order` asc SEPARATOR ', ') | 
+---------------------------------------------------------+ 
| GA-XXXX, Bentley, CONTINENTAL FLYING SPUR, 2006   | 
+---------------------------------------------------------+ 

// Expected result: (only 3 comma-separated records, not 4) 

전체 쿼리

SELECT *,product_id id, 
    (select group_concat(value order by `order` asc SEPARATOR ', ') 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) text 
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) and activated=1 
ORDER BY t1.date desc 

답변

10

가 LIMIT 절, 최종 결과 집합의 행의 수를 제한하지 GROUP_CONCAT에 캐릭터 라인을 구축하기 위해서 사용 된 행수. 쿼리가 최종 결과에서 한 행만 반환하기 때문에 LIMIT는 아무 효과가 없습니다.

LIMIT 3을 사용하여 하위 쿼리를 구성한 다음 외부 쿼리에서 해당 하위 쿼리의 결과에 GROUP_CONCAT를 적용하여 문제를 해결할 수 있습니다.

11

이유가 의도 한대로 작동하지 않습니다. @Mark Byers outlined in the other answer. 대신 다음을 시도 할 수 있습니다 :

SELECT GROUP_CONCAT(`value` ORDER BY `order` ASC SEPARATOR ', ') 
FROM (
      SELECT `value`, `order` 
      FROM  slud_data 
      LEFT JOIN slud_types ON slud_types.type_id = slud_data.type_id 
      WHERE  slud_data.product_id = 18 AND value != '' AND display = 0 
      LIMIT  3 
     ) a; 
0

마크 바이어스 아이디어의 예 :

SELECT GROUP_CONCAT(id, '|', name) 
FROM (
SELECT id, name 
FROM users 
LIMIT 3) inner 
관련 문제