[MySQL] SELECT Abfrage je nach Wert in einer Tabelle (Bedingung)

preko

Erfahrenes Mitglied
Hallo zusammen,

ich möchte eine bedingte MySQL Abfrage generieren. Anhand des Wertes aus einer Spalte „table_name“ der 1. Abfrage soll je nach Wert eine andere Abfrage als Datenquelle generiert werden:

1. Abfrage:

SQL:
SELECT
     *,
     'table_name' AS switch
FROM
     publish
WHERE
     uid IN (SELECT MAX(uid) FROM publish GROUP BY ident)
AND
     obsolete = 0
AND
     state != 0

Steht in der Spalte table_name jedoch der Eintrag: "news", soll folgende Abfrage ausgeführt werden:

2. Abfrage:

SQL:
SELECT
     *
FROM
     publish
LEFT JOIN
     news ON publish.ident = news.uid
WHERE
     publish.uid IN (SELECT MAX(uid) FROM publish GROUP BY ident)
AND
     obsolete = 0
AND
     state != 0

Bei allen anderen Einträgen in der Spalte table_name soll die unter 1. aufgeführte Abfrage durchgeführt werden, d. h. nur wenn table_name (Alias: switch) den Eintrag news enthält, wird die SELECT Abfrage mit dem JOIN generiert, ansonsten soll die 1. Abfrage als gültige Abfrage genommen werden.

Habe mir nun IF und CASE Bedingungen angeschaut, aber kriege irgendwie nicht den richtigen „Pack an“ hin., da diese in meinen Quellen nicht auf einen Wert der ersten Abfrage zugreifen, sondern auf Konstanten, die ich ja im o. g. Fall ja noch nicht habe, sondern erst mittels eines SELECTS auslesen muss.

Ich möchte das ausschließlich per MySQL lösen und nicht per PHP Scripting!

Hat jemand eine zündende Idee?
 
Wenn du es in einem Wisch lösen willst, dann müssen beide Resultate dieselben Spalten in derselben Reihenfolge beinhalten. Fehlt in einer eine Spalte, so muss diese mit Null, '' oder 0 gesetzt werden.
Am besten also den * verbannen. Sonst hat man keine Spaltenkontrolle

In der ersten Abfrage die Spatle SWITCH ein Fixwert 'table_name'. Dort steht also niemalsnie 'news' drin. Ich gehe mal davon aus, dass table_name ein Feld der Tabelle publish ist. Dann kannst du das mit einem UNION lösen.

SQL:
SELECT
	p.table_name,
	p.feld1,
	NULL AS headertext
FROM
	publish p
WHERE
	p.table_name != 'news'
	AND p.uid IN (SELECT MAX(uid) FROM publish WHERE table_name != 'news' GROUP BY ident)
	AND p.obsolete = 0
	AND p.state != 0
UNION ALL
SELECT
	p.table_name,
	p.feld1,
	n.headertext
FROM
	publish p
	LEFT JOIN news n
	ON p.ident = n.uid
WHERE
	p.table_name = 'news'
	AND p.uid IN (SELECT MAX(uid) FROM publish WHERE table_name = 'news' GROUP BY ident)
	AND p.obsolete = 0
	AND p.state != 0[/ocde]
 
Zurück