Używając MySQL
, mogę zrobić coś takiego:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Mój wynik:
shopping
fishing
coding
ale zamiast tego chcę tylko 1 wiersz, 1 kolumnę:
Oczekiwany wynik:
shopping, fishing, coding
Powodem jest to, że wybieram wiele wartości z wielu tabel, a po wszystkich połączeniach mam o wiele więcej wierszy, niż bym chciał.
Szukałem funkcji w MySQL Doc i nie wygląda ona na to, że funkcje CONCAT
lub CONCAT_WS
akceptują zestawy wyników.
Czy ktoś tu wie, jak to zrobić?
mysql
sql
concat
group-concat
Dean Rather
źródło
źródło
Odpowiedzi:
Możesz użyć
GROUP_CONCAT
:Jak stwierdził Ludwig w swoim komentarzu, możesz dodać
DISTINCT
operatora, aby uniknąć duplikatów:Jak stwierdził Jan w komentarzu, możesz także posortować wartości przed zaimplementowaniem ich za pomocą
ORDER BY
:Jak stwierdził Dag w swoim komentarzu, wynik ma limit 1024 bajtów. Aby rozwiązać ten problem, uruchom zapytanie przed zapytaniem:
Oczywiście możesz zmienić w
2048
zależności od potrzeb. Aby obliczyć i przypisać wartość:źródło
DISTINCT
parametr, nie dostaniesz żadnych wyników podwójnych.... GROUP_CONCAT(DISTINCT hobbies)
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Sprawdź,
GROUP_CONCAT
czy Twoja wersja MySQL (4.1) ją obsługuje. Więcej informacji znajduje się w dokumentacji .Wyglądałoby to tak:
źródło
group by 'all'
nie jest to konieczne (zresztą niepożądane), ponieważ to przypisuje ciąg do wszystkich wierszy,all
a następnie porównuje ciągi między tymi wierszami. Czy mam rację?Alternatywna składnia do łączenia wielu pojedynczych wierszy
OSTRZEŻENIE: Ten post spowoduje, że będziesz głodny.
Dany:
Zauważyłem, że chcę wybrać wiele pojedynczych wierszy - zamiast grupy - i połączyć w jedno pole.
Załóżmy, że masz tabelę identyfikatorów produktów oraz ich nazw i cen:
Potem masz jakieś fantazyjne-schmancy ajax, które wymienia te szczeniaki jako pola wyboru.
Twój głodny hipopotam wybiera
13, 15, 16
. Dziś nie ma dla niej deseru ...Odnaleźć:
Sposób na podsumowanie zamówienia użytkownika w jednym wierszu za pomocą czystego mysql.
Rozwiązanie:
Skorzystaj
GROUP_CONCAT
z tejIN
klauzuli :Które wyjścia:
Rozwiązanie premiowe:
Jeśli chcesz również cenę całkowitą, wrzuć
SUM()
:PS: Przepraszam, jeśli nie masz w pobliżu wejścia i wyjścia ...
źródło
Możesz zmienić maksymalną długość
GROUP_CONCAT
wartości, ustawiającgroup_concat_max_len
parametr.Zobacz szczegóły w dokumentacji MySQL .
źródło
Istnieje funkcja GROUP Aggregate, GROUP_CONCAT .
źródło
W moim przypadku miałem wiersz identyfikatorów i konieczne było rzutowanie go na char, w przeciwnym razie wynik został zakodowany w formacie binarnym:
źródło
CAST
miałem takie wartości jak[BLOB - 14 Bytes]
w wyniku!Użyj zmiennej sesji MySQL (5.6.13) i operatora przypisania, jak poniżej
wtedy możesz dostać
źródło
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Miałem bardziej skomplikowane zapytanie i stwierdziłem, że musiałem użyć
GROUP_CONCAT
zewnętrznego zapytania, aby go uruchomić:Oryginalne zapytanie:
Wszczepiony:
Mam nadzieję, że to może komuś pomóc.
źródło
Dla kogoś, kto szuka tutaj sposobu korzystania
GROUP_CONCAT
z podzapytania - opublikowanie tego przykładuDlatego
GROUP_CONCAT
należy go używać wewnątrz podzapytania, a nie owijania go.źródło
Spróbuj tego:
źródło
mamy dwa sposoby konkatenacji kolumn w MySql
Lub
źródło