[mysql] group concat, multirow concat, laczenie rekordow

0

Witam,
mam problem z zastosowaniem (chyba) group concat,

CREATE TABLE IF NOT EXISTS `tab` (
  `cont` int(11) NOT NULL,
  `war` varchar(50) NOT NULL
) 

INSERT INTO `tab` (`cont`, `war`) VALUES
(1, 'miska'),
(1, 'linijka'),
(1, 'bierki'),
(2, 'noz mysliwski'),
(3, 'magiczny wielomian'),
(3, 'molekularny defragmentator');

Otóż chciałbym, aby wynikiem zapytania było:

cont, war; 
1, 'miska.linijka.bierki'; 
2, 'noz mysliwski'; 
3, 'magiczny wielomian.molekularny defragmentator'; 

próbowałem coś a'la:

SELECT group concat (select war from `tab` a where a.cont=b.cont separator '.') 
FROM `tab` b 
group by b.cont

ale blad, ktorego nie potrafie wyeliminowac mnie dobija #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group concat (select war from tab a where a.cont=b.cont separator '.') FROM ' at line 1

Do tego obawiam sie jeszcze, że w korzystam nie z tej funkcji, co potrzeba. :(

W ogóle jest to możliwe?

0

Korzystasz z dobrej funkcji, tylko w niewłaściwy sposób. Dokładnie nazywa się ona "GROUP_CONCAT" a nie "GROUP CONCAT" :)

Wstaw sobie to podzapytanie do swojego zapytania głównego:
( SELECT GROUP_CONCAT( a.war SEPARATOR '.' ) FROM tab a WHERE a.cont = b.cont )

0

Dziękuję pięknie! :D

Mam jeszcze jedno pytanko, teraz natury czysty optymalizacyjnej.
Otóż ten group_concat chce wykorzystać w zapytaniu złożonym z podzapytań, gdzie argumentami group_concat są właśnie wyniki tych dynamicznych wynikow,

sql napisał(a)

SELECT *,( SELECT GROUP_CONCAT( a.war SEPARATOR '.' ) FROM

(select * from tab where cont<200) a
WHERE a.id = b.id )
FROM

(select * from tab where cont<200) b

mozna żauwazyć, że pogrubione elementy wykonują się 2 razy,
patrząc na to sądzę, że nie ominę tego,
dlatego właśnie się pytam:
"czy możliwe jest takie zmodyfikowanie zapytania, aby bylo na kształt:

sql napisał(a)

SELECT *,( SELECT GROUP_CONCAT( a.war SEPARATOR '.' ) FROM

b a
WHERE a.id = b.id )
FROM

(select * from tab where cont<200) b

chodzi oczywiście mi o zachowanie zrobienia wszystkiego w jednym zapytaniu.
Miłego dnia,
test30

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