Seite 1 von 1

[Gelöst]Felder per UPDATE füllen oder mit "UNION ALL" Zusammenfassen

Verfasst: Mi 15. Feb 2023, 15:25
von Chr_Alt
Hallo,

ich habe folgende Herausforderung:

Beim letzten Umzug habe ich die Sortierung meiner physischen Tonträger geändert:
Vorher: „INTERPRET_GRUPPE“ > VÖ > Titel (des Albums)
Nachher: „Nachname“ > „Vorname“ > „VÖ“ > Titel

In meiner Musikdatenbank habe ich eine Tabelle „INTERPRETEN _ GRUPPEN“ mit 3 Feldern: „INTERPRET_GRUPPE“, URL des Künstlers und „GESCHICHTE“

Für die oben beschriebene Aufgabe habe ich mir folgende Lösung überlegt:

In der Tabelle „INTERPRETEN _ GRUPPEN“ zusätzliche Felder „Vorname“, „Nachname“ und „Künstler“

Die beiden Felder „Vorname“ und „Nachname“ habe ich per „UPDATE“ mit Inhalten gefüllt und auch eine Formel gefunden mit der ich das Feld „Künstler“ füllen kann.

Dabei bin ich auf das folgende Problem gestoßen: Das Feld „Künstler“ erhält das was ich für Einzelne Künstler haben möchte nämlich „Vorname Nachname“ (Beispiel: „Phil Collins).
So weit so gut. Bei Bandnamen bekomme ich aber diesen doppelt (Beispiel: Genesis Genesis)

Also habe ich 2 Lösungen ausprobiert:

Über eine „UNION“-Abfrage 2 Abfragen zu verbinden:
in der 1. Abfrage für einzelne Interpreten (z. B. „Phil Collins)
in der 2. auf das Feld „Nachname“ so das Ergebnis eben der Bandname ist (z. B. „Genesis“)

Dazu habe ich folgende Abfragen erstellt, leide alle ohne positives Ergebnis:

Code: Alles auswählen

Variante 1.1
SELECT `I`.`INTERPRET_GRUPPE` AS `INTERPRET_GRUPPE`, `I`.`Vorname` AS `Vorname`, `I`.`Nachname` AS `Nachname`, `I`.`Nachname` AS `Künstler` 
FROM
(
(SELECT `I`.`INTERPRET_GRUPPE`, `I`.`Vorname`, `I`.`Nachname`  AS Nachname , CONCAT( `I`.`.`Vorname`, ' ', `I`..`Nachname` ) AS `Künstler` 
FROM `INTERPRETEN _ GRUPPEN` AS `I` 
WHERE `Vorname` != `INTERPRETEN _ GRUPPEN`.`Nachname`)
 
 UNION ALL
 
(SELECT `I`.`INTERPRET_GRUPPE`, AS  `Vorname`, `I`.`Nachname` AS `Nachname`, `I`.`Nachname` AS `Künstler` 
FROM `INTERPRETEN _ GRUPPEN` AS `I` 
WHERE `Vorname` = `INTERPRETEN _ GRUPPEN`.`Nachname`)
)
GROUP BY  `I`
ORDER BY `Vorname`

Variante 1.2
SELECT `Vorname`, `Nachname`,`Künstler`
FROM

((SELECT `INTERPRET_GRUPPE`,`Vorname`, `Nachname`, CONCAT( `Vorname`, ' ', `Nachname` ) AS `Künstler` FROM `Musik`.`INTERPRETEN _ GRUPPEN` AS `INTERPRETEN _ GRUPPEN` where `Vorname` != `Nachname`
 GROUP BY `Künstler`)

UNION ALL

(SELECT `INTERPRET_GRUPPE`,`Vorname`, `Nachname`, `Nachname` AS `Künstler` FROM `Musik`.`INTERPRETEN _ GRUPPEN` AS `INTERPRETEN _ GRUPPEN` WHERE `Vorname` != `Nachname` GROUP BY `Künstler`))
GROUP BY `Künstler`
ORDER BY `Vorname`, `Nachname`
Variante 1.3
SELECT `I-G`.`INTERPRET_GRUPPE`, `I-G`.`Vorname`, `I-G`.`Nachname`, `I-G`.`K`
 FROM
 (SELECT `I-G`.`INTERPRET_GRUPPE`, `I-G`.`Vorname`, `I-G`.`Nachname`, CONCAT(`I-G`..`Vorname`, ' ', `I-G`.`Nachname` ) AS `I-G`.`K` 
 FROM `INTERPRETEN _ GRUPPEN` AS `I-G` 
 WHERE `I-G`.`Vorname` != `I-G`.`Nachname` GROUP BY `I-G`.`K` ORDER BY `K`)
 
 UNION ALL
 
 (SELECT `I-G`.`INTERPRET_GRUPPE`, `I-G`.`Vorname`, `I-G`.`Nachname`,`I-G`.`Nachname` AS `I-G`.`K` 
 FROM `INTERPRETEN _ GRUPPEN` AS `I-G` 
 WHERE `I-G`.`Vorname` != `I-G`.`Nachname` GROUP BY `I-G`.`K` ORDER BY `K`)
 

Als weiteren Weg habe ich da Feld „Vorname“ für alle Bands/Gruppen gelöscht ( in der DB über den Browser, nicht über Libreoffice-Base funktioniert hat) und die Abfrage die für Einzelkünstler auf alle Datensätze ausgeweitet mit folgender Formel, welche die Felder „Vorname“ und „Nachname “ zusammenfasst (z. B. „Phil Collins):

Code: Alles auswählen

Variante 2.1
CONCAT( `INTERPRETEN _ GRUPPEN`.`Vorname`, ' ', `INTERPRETEN _ GRUPPEN`.`Nachname` ) AS `Künstler` FROM `INTERPRETEN _ GRUPPEN`
Das Ergebnis dieser Abfrage ist das nur die Datensätze mit beiden gefüllten Feldern ausgegeben wird, nicht aber die der Bands bei denen das Feld „Vorname“ leer ist.

Der ganze Krempel läuft auf einem Intel-NUC mit Debian 10 in 2 PROXMOX-VM ebenfalls mit Debian 10, eine mit dem WEB-Server unter Apache2 und eine für MariaDB.

Gruß und vielen Dank im Voraus

Christian

Re: Felder per UPDATE füllen oder mit "UNION ALL" Zusammenfassen

Verfasst: Mi 15. Feb 2023, 19:32
von RobertG
Hallo Christian,

einfacher wäre es, wenn Du das irgendwie in eine interne Datenbank mit ein paar Daten packen und hochladen könntest. So ist mir die Analyse Deine UNION ALL-Codes (der wegen ALL zur Verdoppelung von Daten führen kann) zu kompliziert. Du schreibst auch nicht, was da am Ergebnis nicht stimmt.

Bei dem 2. Code: Wenn Du die Ohne `Vorname` auch anzeigen willst, dann geht das über IFNULL. Da Du mit CONCAT arbeiten musst (MariaDB)

Code: Alles auswählen

SELECT 
CONCAT(
IFNULL(CONCAT( `INTERPRETEN _ GRUPPEN`.`Vorname`, ' '),''), 
`INTERPRETEN _ GRUPPEN`.`Nachname` ) AS `Künstler` 
FROM `INTERPRETEN _ GRUPPEN`
Gruß

Robert

Re: Felder per UPDATE füllen oder mit "UNION ALL" Zusammenfassen

Verfasst: Do 16. Feb 2023, 19:58
von Chr_Alt
Hallo Robert,

ich habe nun mittels CONCAT(IFNULL(CONCAT ....) das Feld "Künstler" sowohl in der Tabelle der Interpreten als auch in der Tabelle der Alben gefüllt, so das ih alles Andere mit dem Feld erledigen kann.

Also vielen Dank dafür.

Wenn Du das gebrauchen kannst, kann ich natürlich noch die Fehlermeldungen der 3 Varianten mit UNION liefern. Ich selber werde sie allerdings vermutlich nicht mehr benötigen.

Gruß

Christian

Re: Felder per UPDATE füllen oder mit "UNION ALL" Zusammenfassen

Verfasst: Fr 17. Feb 2023, 08:07
von RobertG
Hallo Christian,

wichtig ist doch, dass das Problem gelöst ist. Wenn ein Problem mit UNION auftaucht einfach neu schreiben.

Gruß

Robert