2011-12-19 11 views
12

Chcę zwrócić wiersz dla każdego klastra danych, który ma unikalny amount, operation, months i fee dla danego identyfikatora.Identyfikatory listy w zapytaniu grupowym

Tabela przedstawia się następująco:

enter image description here

prawie mogę dostać to, co chcę z

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

Która dostanie:

enter image description here

jednak zauważyć tylko zwraca jedną plan_id, gdy chcę, aby zwrócił coś w rodzaju: 1, 2, 3

Czy to możliwe?

Odpowiedz

25

Można użyć 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 

Uważaj jednak, że domyślna długość maksymalna to 1024, więc jeśli robisz to z dużego stołu, można mieć wartości skróconych ..

+0

Ten wraca 'plan_id' o wartości' [blob - 5 B ] ' –

+0

nvm, udało się go uruchomić po obejrzeniu http://bugs.mysql.com/bug.php?id=19473 –

0

Nie polecam GROUP_CONCAT, jeśli potrzebujesz czegoś dynamicznego. GROUP_CONCAT ma limit. Co można zrobić, to użyć tabeli tymczasowej, w której najpierw można wybrać wszystkie wiersze, a następnie uzyskać zgrupowane wyniki. Aby uzyskać identyfikatory, można zapętlić grupy i wybrać z tabeli tymczasowej klauzulę WHERE, która ma wszystkie grupy jako warunek. Rozumiem, że może to być trochę zbyt skomplikowane, ale wydaje mi się, że jest to dobre rozwiązanie, jeśli naprawdę potrzebujesz śledzić identyfikatory.

1

To, co wymyśliłem przy rozwiązywaniu tego problemu, to dołączenie do wyniku group by z tą samą tabelą na polach grupy. Zauważ, że oświadczenie WHERE jest taka sama w obu wybiera

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 

Teraz możesz grać z takim skutkiem, aby uzyskać dokładnie to, co chcesz