[MySQL] Wyciągnie kilku stringów z GROUP BY

0

Nie wiem czy dobra kategoria forum

Mam relację jeden do wielu (klucz-wartość, jeden klucz może mieć wiele wartości). Chcę we froncie wyświetlić klucze i jego możliwe wartości. Robię to tak

SELECT
  `keys`.`key`, GROUP_CONCAT(`values`.text SEPARATOR ',')
FROM `keys`
  JOIN `values` ON `keys`.id = `values`.key_id
GROUP BY `keys`.`key`;

Niestety jeśli w jakiejś wartości będzie przecinek, to potem nie będzie się dało tego rozbić na arraya stringów.

W Postgresie użyłbym json_agg, żeby sobie zgrupować te stringi, i potem je tylko zdeserializować i wysłać do frontu. Chciałbym to zrobić w SQL ponieważ takich kluczy może być bardzo dużo, i nie chcę niepotrzebnie robić load'a rozwiązując to w backendzie, zamiast w bazie.

Jedyny pomysł jaki mam to użyć jakiegoś dzikiego separatora w GROUP_CONCAT (np ^), i po prostu zakazać używania takiego znaku w values, ale nie wydaje mi się to dobrym pomysłem.

Any ideas?

0

Przykładowe dane

SELECT * FROM `keys`
  JOIN `values` ON `keys`.id = `values`.key_id;
keys.id keys.key values.id values.key_id values.value
1 'first' 1 1 'pierwsza'
1 'first' 2 1 'druga'
1 'first' 3 1 'trzecia,haha'

A efekt jaki chciałbym uzyskać:

SELECT
  `keys`.`key`, GROUP_CONCAT(`values`.text SEPARATOR ',')
FROM `keys`
  JOIN `values` ON `keys`.id = `values`.key_id
GROUP BY `keys`.`key`;
keys.key values.value
'first' 'pierwsza,druga,trzecia,haha' // backend zobaczy 4 rekordy, mimo że są 3
0

Nie baw się w takie group_concat - w XXI wieku już nie warto.

0

Po prostu zwróć wszystkie dane bez grupowania ich w zapytaniu.

Nie baw się w premature optimization - nie ma takiej potrzeby, jedynie sam sobie życie komplikujesz.

0

I grupować je w backendzie?

0

Tak.

Jeśli wtedy dopiero wydajność będzie niska, zastanów się nad przeniesieniem tego do bazy.

0

Ja bym tego nie nazwał przedwczesna optymalizacją...
Niewielkim nakładem osiągniesz wynik identyczny z json_agg, a o ile to wygodniej:

SELECT
    `keys`.`key`,
    concat('["', GROUP_CONCAT(replace(`values`.text,'"','\\"') SEPARATOR '","'), '"]')  jsondata
FROM 
    `keys`
    JOIN `values` ON `keys`.id = `values`.key_id
GROUP BY 
    `keys`.`key`;
0

@TomRiddle:

Musiałbym też poprzedzić \ sleshem, gdzie Ty masz głowę Panczo

głowe mam na swoim miejscu i nie wiem co chcesz i czym poprzedzać:
Dla danych

CREATE TABLE tab
    (`value` varchar(14))
;
    
INSERT INTO tab
    ("value")
VALUES
    ('wartos"c,z'),
    ('przecikami,nie'),
    ('jest'),
    ('problemem');

Zapytanie na MySQL

SELECT CONCAT(  '["', GROUP_CONCAT( REPLACE(  `value` ,  '"',  '\\"' ) 
SEPARATOR  '","' ) ,  '"]' ) 
FROM tab

Zwróci:

["wartos\"c,z","przecikami,nie","jest","problemem"]

Zapytanie na Postgre

select json_agg(value) from tab

Zwróci:

["wartos\"c,z", "przecikami,nie", "jest", "problemem"]

Więc nie wiem z czego wynika Twój komentarz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1