MySQL, Spaltenwerte als Spaltennamen im INNER JOIN benutzen

placeboo

Grünschnabel
Guten Morgen Leute,

Folgendes Problem:

Ich habe folgende Tabellen

veranstaltung6
uniTimeNr | curricula | semester
-----------------------------------------
053 | 7 | s3
053 | 8 | s1
060 | 1 | s5


curricula
curriculaNr | s1 | s3 | s4 | s5
----------------------------------------------
7 | NULL|46 |NULL| NULL
8 |126 |59 |NULL|NULL
1 |NULL |NULL|NULL|100


und möchte folgendes erhalten:

s1 | s3 | semester | curriculaNr
-------------------------------------------------
NULL |46 | s3 | 7
126 |59 | s1 | 8


Mein Ansatz ist folgender MySQL-Code:

Code:
select
		@var:= v.semester
	   from
		veranstaltung6 as v
		inner join curricula as c
			on v.curricula = c.curriculaNr
           where v.uniTimeNr = '053';

SET @SQL = CONCAT('select ', @var,', v.semester, c.curriculaNr 
                                   from veranstaltung6 as v 
                                   inner join curricula as c 
                                       on v.curricula = c.curriculaNr 
                                   where v.uniTimeNr = "053"');
PREPARE stmt FROM @SQL;
EXECUTE stmt;


Ich erhalte folgendes:

s1 | semester | curriculaNr
-----------------------------------------
NULL| s3 |7
126 | s1 |8


Wie kriege ich es hin, dass mehr als nur ein Spaltenwert erkannt und als Spaltenname genutzt werden kann?
Geht das überhaupt nur über select-Anweisungen oder muss ich es über eine "Procedure" machen?

Freundlicher Gruß
placeboo
 
Ich hab dein SQL gar ad nicht verstanden. Aber laut deiner Bescrheibung reicht ja sowas aus
SQL:
SELECT
	c.s1,
	c.s2,
	v.semester,
	v.curriculaNr
FROM
	veranstaltung6 v
	curricula c
WHERE
	v.curricula = c.curriculaNr
	AND v.uniTimeNr = '053'

Nachtrag: Docj, jetzt versteh ich. Due willst nur dir masgebenden Felder auswählen.
Die @var kann ja mehrere Spalten beinhalten:
SQL:
SELECT 
   @var := GROUP_CONCAT(DISTINCT v.semester ORDER BY v.semester  SEPARATOR ', ')  AS semester_list
FROM 
    veranstaltung6 AS v 
    INNER JOIN curricula AS c ON v.curricula = c.curriculanr 
WHERE 
    v.unitimenr = '053'
GROUP BY
	v.unitimenr;
 
Zuletzt bearbeitet von einem Moderator:
Guten Morgen Yaslaw,

erstmal vielen Dank für die wirklich sehr sehr schnelle Antwort.

Entschuldige. In meiner Fragestellung kommt nicht wirklich rüber, was ich machen will,
weil ich noch etwas entscheidendes vergessen habe.

Ich wollte über

s1 | s3 | semester | curriculaNr
-------------------------------------------------
NULL |46 | s3 | 7
126 |59 | s1 | 8


eigentlich erreichen, dass folgender Wert ausgegeben wird:

(126+46)
----------------
172

Also noch einmal:
Zuerst soll der Code in der Tabelle veranstaltung6 überall wo uniTimeNr=053 schauen, was in der spalte semester steht. Diese Werte stellen in der Tabelle curricula Spaltennamen dar.
Nun soll der Code mit Hilfe der Spalte curricula (Schlüssel) der Tabelle veranstaltung6, der Spalte curriculaNr (Schlüssel) der Tabelle curricula und der vorher herausgefundenen Werte, die Spalten in der Tabelle veranstaltung6 darstellen, alle relevanten Werte summieren und ausgeben.

Ich hoffe, dass ich das verständlich ausgedrückt habe.

Über einen Ratschlag wäre ich sehr dankbar.

Freundlicher Gruß
placeboo
 
Zuletzt bearbeitet:
Habe folgenden Ansatz:


SQL:
SELECT 
   @var1 := '(sum(',
   
   @var2 := GROUP_CONCAT(DISTINCT v.semester ORDER BY v.semester  SEPARATOR ' )+sum( '),

   @var3 := ')',

   @var4 := @var1 + @var2 + @var3

   

FROM 
    veranstaltung6 AS v 
    INNER JOIN curricula AS c ON v.curricula = c.curriculanr 
WHERE 
    v.unitimenr = '053'
GROUP BY
    v.unitimenr;





SET @sql = CONCAT('select ', @var4,' 
				   from veranstaltung6 as v 
				   inner join curricula as c 
						on v.curricula = c.curriculaNr 
				   where v.uniTimeNr = "053"');
PREPARE stmt FROM @sql;
EXECUTE stmt;



und bekomme folgende Ausgabe:

0
---
0
0


Eigentlich muss ich doch nur hinbekommen, dass in die Variable @var4 im Fall von "unitimenr=053" "(sum(s1)+sum(s3))" generiert wird. Aber irgendwas mache ich falsch.

Ich brauche Eure Hilfe.


Freundlicher Gruß
placeboo
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück