SELECT-Ergebnis als SET erstellen

Steusi

Nasenbär
Hallo Leute,

ich habe gerade einen skurrilen Fall und zwar möchte ich gern bei einer SELECT-Abfrage eine neue Spalte erzeugen, in der alle gefundenen Werte einer anderen SELECT-Abfrage als Kommagetrennte Auflistung (sprich SET) erscheinen.

vereinfacht dargestelltes Beispiel:
Code:
tab1
a	b
5	1
6	1
7	2

In einer Abfrage möchte ich nun darauf zurückgreifen und zwar so:
SQL:
SELECT b,(SELECT ALS_SET(a) FROM tab1 WHERE b=1) as test
FROM tab2

Damit das Ergebnis so aussieht:
Code:
ergo
b		test
Hans	5,6

Geht sowas?
 
Zuletzt bearbeitet von einem Moderator:
Jepp. GROUP_CONCAT

SQL:
SELECT
    b,
    GROUP_CONCAT(a SEPARATOR ',') AS test
FROM
    tab1
GROUP BY
    b;
 
Zuletzt bearbeitet von einem Moderator:
Danke Yaslaw,
jetzt wo ich es sehe fällt mir ein, dass du mir vor Jahren schon mal diesen Tipp gegeben hast. Danke.

Aber meine finale Abfrage bekommen ich leider noch nicht ganz hin :(
Ausgangstabelle (test):
Code:
ID 	a 	b 	c 	d 	nummer
1 	5 	3 	2 	1 	A
2 	5 	3 	2 	1 	B
3 	5 	7 	2 	0 	A
4 	5 	6 	4 	3 	A
5 	5 	6 	4 	3 	B
6 	5 	6 	4 	3 	C
7 	5 	6 	4 	3 	D

Meine Zielansicht:
Code:
a 	b 	c 	d 	nummer	zusatz
5 	3 	2 	1 	A	B
5 	7 	2 	0 	A	null
5 	6 	4 	3 	A	B,C,D

Meine SQL-Abfrage lautet wie folgt, welche ich etwas umständlich finde!
SQL:
SELECT a,b,c,d,GROUP_CONCAT(nummer SEPARATOR ',') AS test
FROM
(SELECT nummer, a,b,c,d,CONCAT( a,'-',b,'-',c,'-',d ) as platz FROM test
WHERE CONCAT( a,'-',b,'-',c,'-',d ) IN (
SELECT CONCAT( a,'-',b,'-',c,'-',d ) AS test
FROM test
GROUP BY test
HAVING Count( * ) >1) 
AND nummer != 'A') as alle
GROUP BY platz

Code:
a 	b 	c 	d 	test
5 	3 	2 	1 	B
5 	6 	4 	3  	C,D,B

Bei mir fällt die nummer A schließlich komplett raus, ich dachte dies einfach durch einen
SQL:
FULL OUTER JOIN
lösen zu können, doch dies gibt es in MySQL wohl nicht :(

Sieht jemand einen guten Ansatz, was ich auf jedenfall ändern sollte?
 
Zuletzt bearbeitet von einem Moderator:
So auf die schnelle und völlig ungetestet
SQL:
SELECT
	a, b, c, d,
	nummer,
	GROUP_CONCAT(zusatz_item SEPARATOR ',') AS zusatz
FROM
	(
		SELECT
			a, b, c, d,
			@code := CONCAT_WS('#', a, b, c, d) AS code,
			@nummer := IF(@code = @last_code, @nummer, nummer) AS nummer,
			IF(@code = @last_code, nummer, FALSE) AS zusatz_item,
			@last_code := @code AS last_code_zuordnung
		FROM
			(SELECT @code := 0, @last_code := '', @nummer = '') AS vars
			test
	) AS src
GROUP BY
	a, b, c, d, nummer
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank erstmal.
Also der Schritt übersteigt gerade meinen Kenntnisstand. Ich verstehe etwas grundlegendes nicht. Die Ausgabe der inneren Abfrage ändert sich.

Wenn ich die innere Abfrage ausführe habe ich ein Ausgabe mit der ich arbeiten könnte:
Abfrage:
SQL:
SELECT
            a, b, c, d,
            @code := CONCAT_WS('#', a, b, c, d) AS code,
            @nummer := IF(@code = @last_code, 'A', nummer) AS nummer,
            IF(@code = @last_code, nummer, FALSE) AS zusatz_item,
            @last_code := @code AS last_code_zuordnung
        FROM
            (SELECT @code := 0, @last_code := '', @nummer = '') AS vars,
            test
Ausgabe:
Code:
a 	b 	c 	d 	code 	nummer 	zusatz_item 	last_code_zuordnung
5 	3 	2 	1 	5#3#2#1 	A 	        0 	 	5
5 	3 	2 	1 	5#3#2#1 	A 	        B 	 	5
5 	7 	2 	0 	5#7#2#0 	A 	        A 	 	5
5 	6 	4 	3 	5#6#4#3 	A 	        B 	 	5
5 	6 	4 	3 	5#6#4#3 	A 	        C 	 	5
5 	6 	4 	3 	5#6#4#3 	A 	        D 	 	5
5 	6 	4 	3 	5#6#4#3 	A 	        A 	 	5
Wozu wird last_code_zuordnung gebraucht?

Ändere ich die Abfrage wie folgt:
SQL:
SELECT a,b,c,d,code,nummer,zusatz_item
FROM (
      SELECT
            a, b, c, d,
            @code := CONCAT_WS('#', a, b, c, d) AS code,
            @nummer := IF(@code = @last_code, 'A', nummer) AS nummer,
            IF(@code = @last_code, nummer, FALSE) AS zusatz_item,
            @last_code := @code AS last_code_zuordnung
        FROM
            (SELECT @code := 0, @last_code := '', @nummer = '') AS vars,
            test
) as test
erhalte ich folgende Ausgabe:
Code:
a 	b 	c 	d 	code 	nummer 	zusatz_item
5 	3 	2 	1 	5#3#2#1 	A 	0
5 	3 	2 	1 	5#3#2#1 	A 	B
5 	7 	2 	0 	5#7#2#0 	A 	0
5 	6 	4 	3 	5#6#4#3 	B 	0
5 	6 	4 	3 	5#6#4#3 	A 	C
5 	6 	4 	3 	5#6#4#3 	A 	D
5 	6 	4 	3 	5#6#4#3 	A 	A

Wie kann das sein?
Kannst du mir eine gute Anleitung empfehlen, damit ich dieses Konstrukt verstehe;)


//edit:
Die Sortierung hat mir einen Strich durch die Rechnung gemacht. Nachdem ich mich nun einfach durch Tests mit der Variablendeklaration vertraut gemacht hab, komme ich zu folgender Lösung:
SQL:
SELECT a,b,c,d,nummer,
       GROUP_CONCAT(zusatz_item SEPARATOR ',') as zusatz
FROM 
	(SELECT a, b, c, d, nummer,
	       @CODE := CONCAT_WS('#', a, b, c, d) AS code,
	       @zusatz_item :=IF(@CODE = @last_code,nummer,null) as zusatz_item,
	       @last_code := @CODE
	FROM
	      (SELECT @last_code := '') as var,
	      test

	ORDER by code,nummer
	) as src
GROUP BY 
code
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück