2011-12-19 14 views
12

Desidero restituire una riga per ogni cluster di dati con un numero unico amount, operation, months e fee per un determinato ID.ID elenco nella query di gruppo

Table è la seguente:

enter image description here

posso quasi ottenere ciò che voglio con

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

che otterrà:

enter image description here

Ma notarlo solo restituisce uno plan_id quando voglio restituire qualcosa come 1, 2, 3

È possibile?

risposta

25

Si potrebbe utilizzare 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 

Attenzione però, che la lunghezza massima predefinita è 1024, quindi se si sta facendo questo con un grande tavolo, si potrebbe avere valori troncati ..

+0

Questo sta tornando 'plan_id' con un valore di' [BLOB - 5 B ] ' –

+0

nvm, è riuscito a farlo funzionare dopo aver consultato http://bugs.mysql.com/bug.php?id=19473 –

5

Dai un'occhiata alla funzione group_concat().

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

0

Non consiglierei GROUP_CONCAT, se avete bisogno di qualcosa di dinamico. GROUP_CONCAT ha un limite. Quello che potresti fare è usare una tabella temporanea in cui puoi selezionare prima tutte le righe, quindi puoi ottenere i risultati raggruppati. Per ottenere gli ID è possibile eseguire il loop dei gruppi e selezionare dalla tabella temporanea una clausola WHERE che ha come condizione tutti i gruppi. Capisco che potrebbe essere un po 'troppo complicato per una cosa del genere ma mi sembra che sia una buona soluzione se hai davvero bisogno di tenere traccia degli ID.

1

Quello che mi è venuto in mente quando si ha a che fare con questo problema, è quello di unire il risultato group by con la stessa tabella nei campi del gruppo. Si noti che l'istruzione WHERE è lo stesso in entrambi seleziona

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 

Ora si può giocare con il risultato di ottenere esattamente quello che vuoi

Problemi correlati