2011-12-19 15 views
12

Quiero devolver una fila para cada clúster de datos que tiene un único amount, operation, months y fee para un ID determinado.ID de lista en consulta de grupo

tabla es la siguiente:

enter image description here

Casi puedo conseguir lo que quiero con

SELECT amount, operation, months, fee, plan_id 
FROM promo_discounts 
WHERE promo_id = 1 
GROUP BY amount, operation, months, fee 

que conseguirá:

enter image description here

Pero nótese que sólo devuelve uno plan_id cuando quiero que devuelva algo como 1, 2, 3

¿Esto es posible?

Respuesta

25

Usted podría utilizar GROUP_CONCAT

SELECT amount, operation, months, fee, 
    GROUP_CONCAT(DISTINCT plan_id SEPARATOR ',') AS plan_id 
FROM promo_discounts 
WHERE promo_id = 1 
GROUP BY amount, operation, months, fee 

Sin embargo, Aviso, que la longitud máxima por defecto es 1024, por lo que si usted está haciendo esto con una gran mesa, que podría tener valores truncados ..

+0

Esto se vuelve 'plan_id' con un valor de' [BLOB - 5 B ] ' –

+0

nvm, fue capaz de hacerlo funcionar después de mirar http://bugs.mysql.com/bug.php?id=19473 –

5

Eche un vistazo a la función group_concat().

SELECT *, GROUP_CONCAT(id SEPARATOR ",") AS grouped_ids FROM table

0

No recomendaría GROUP_CONCAT, si necesita algo dinámico. GROUP_CONCAT tiene un límite. Lo que podría hacer es usar una tabla temporal donde puede seleccionar todas las filas primero, luego puede obtener los resultados agrupados. Para obtener los ID, puede hacer un bucle en los grupos y seleccionar de la tabla temporal con una cláusula WHERE que tenga todos los grupos como condición. Entiendo que puede ser un poco demasiado complicado para tal cosa, pero me parece que es una buena solución si realmente necesita hacer un seguimiento de los ID.

1

Lo que se me ocurrió al abordar este problema, es unir el resultado group by con la misma tabla en los campos del grupo. Observe que la declaración WHERE es la misma en ambos selecciona

SELECT plan_id 
FROM promo_discounts pd 
JOIN (SELECT amount, operation, months, fee 
    FROM promo_discounts 
    WHERE promo_id = 1 
    GROUP BY amount, operation, months, fee 
) AS grup ON pd.amount = grup.amount 
      AND pd.operation = grup.operation 
      AND pd.months = grup.months 
      AND pd.fee = grup.fee 
WHERE promo_id = 1 

Ahora se puede jugar con el resultado de conseguir exactamente lo que quiere

Cuestiones relacionadas