2010-07-31 14 views
9

Necesito seleccionar algunas filas de la segunda tabla y concatenarlas en una cadena separada por comas. La consulta funciona bien, excepto un problema: siempre selecciona todas las filas e ignora LIMIT.LÍMITE ignorado en la consulta con GROUP_CONCAT

Esto es parte de mi consulta que obtiene esa cadena y hace caso omiso LÍMITE:

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) 

consulta completa:

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 

Respuesta

10

La cláusula LIMIT limita el número de filas del conjunto de resultados finales, no el número de filas utilizadas para construir la cadena en GROUP_CONCAT. Como su consulta devuelve solo una fila en el resultado final, el LÍMITE no tiene efecto.

Puede resolver su problema mediante la construcción de una subconsulta con LIMIT 3, luego en una consulta externa aplicar GROUP_CONCAT al resultado de esa subconsulta.

11

Su consulta no está funcionando como esperaba por las razones @Mark Byers outlined in the other answer. Es posible que desee probar el siguiente lugar:

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

Un ejemplo de la idea de Mark Byers:

SELECT GROUP_CONCAT(id, '|', name) 
FROM (
SELECT id, name 
FROM users 
LIMIT 3) inner 
Cuestiones relacionadas