SQL Felder zusammenfassen und zurückschreiben

Mirko_R

Grünschnabel
Hallo,

ich möchte aus den Tabellen einer Datenbank zwei vorhandene Spalten miteinander verknüpfen und dann das Ergebnis wieder in die eine Spalte zurückschreiben - Beispiel:

1. Tabelle heißt: articles
1. Spalte heißt: title

2. Tabelle heißt: manufacturers
2. Spalte heißt: title

Das Ergebnis soll sein: manufacturers-title articles-title und soll dann in die 1.Spalte der 1.Tabelle geschrieben werden (Beispiel aus "Siemens" in der 2. Spalte und "Lüfter" in der 1. Spalte soll dann "Siemens Lüfter" werden und in die 1. Spalte geschreiben werden.

In einem PHP-Template habe ich das für die Bildschirmausgabe wie folgt gelöst:
[{assign var="Manufacturer" value=$Article->getManufacturer()}]
[{ $Manufacturer->manufacturers__title->value}] [{$Article->articles__title->value}]

Wie kann ich diese Routine einmal per SQL über die Datenbank laufen lassen so dass die Fehler geändert werden? Danke!
 
Moin Mirko_R,

hat denn jeder Artikel-Datensatz auch ein Feld namens ManufacturerID, mit dem auf eine ManufacturerID in der manufactures-Tabelle referenziert werden kann?


Per SQL können wir doch nur auf der Ebene Tabellen und Felder jonglieren... da hilft es doch wenig, wenn du es für die Bildschirmausgabe mit $Article->getManufacturer() gelöst hast.

BTW: Warum willst du jeden Artikel des Herstelles XY umbenennen in "XY Artikel"?

Vorher hattest du dann einen "Lüfter" vom Hersteller "Siemens", nach dem "Zurückschreiben", wie du es ausdrückst, einen "Siemens Lüfter" vom Hersteller "Siemens".
Wird das übersichtlicher oder möchtest du nur die Länge des Textfeldes "title" besser ausnutzen?

Grüße
Biber
 
Hallo,

korrekt - jeder Artikel-Datensatz hat auch ein Feld namens ManufacturerID, mit dem auf eine ManufacturerID in der manufactures-Tabelle referenziert werden kann

Ich will du jeden Artikel des Herstelles XY umbenennen in "XY Artikel" um das alles übersichtlicher zu gestalten...

Gibt es da eine Chance, das Ganze per SQL zu "automatisieren"?

Grüße
 
Hallo,

so aus der Hüfte heraus:
SQL:
UPDATE articles a1
SET a1.title = (select CONCAT(a2.title,' ',m1.title) from article a2 JOIN manufacturers m1 ON m1.id = a2.id where a1.id = a2.id)
 
Moin Mirko_R,

rein handwerklich habe ich wenig Sorgen bezüglich der Umsetzbarkeit.
Inhaltlich halte ich es für unsinnig, da du diese Information ebensogut mit einem JOIN und einem on the fly zusammengebauten Text aus den vorhandenen Daten erzeugen könntest.

Aber egal, ein UPDATE-Statement würde ungefähr so aussehen:
SQL:
UPDATE article a
  INNER JOIN Manufacturers m ON a.manufacturerID=m.manufacturerID
SET a.title = CONCAT(TRIM(m.Title) , ' ' , TRIM(a.title))
 -- WHERE Length(CONCAT(TRIM(m.Title) , ' ' , TRIM(a.title)) <= [länge von Feld a.title]

Wie bei jedem UPDATE vorher die möglichen Fehler gedanklich abklopfen.
Theoretisch können sowohl a.title wie auch b.Titel NULL sein... das prüfe ich nicht beim WHERE.
Weil... okay, in meinen Tabellen wären es Pflichtfelder/nicht nullable.

Was ich aber prüfen würde: ob die Länge des neuen Gesamt-Titels überhaupt in das Feld Article.title passt.
Siehe die auskommentierte WHERE-Zeiile

Grüße
Biber
[Edit] Kalito war schneller. ;-) [/Edit]
 
Zuletzt bearbeitet:
@Kalito: komme leider erst jetzt dazu, das zu testen.

wofür stehen denn die Variablen a1, a2 und m1 (meine Daten stehen in der 1. Tabelle (heißt: articles) und dort in der Spalte title sowie in der 2. Tabelle (heißt: manufacturers) und dort in der Spalte title)?

@Biber3: wofür stehen denn die Variablen a, m (meine Daten stehen in der 1. Tabelle (heißt: articles) und dort in der Spalte title sowie in der 2. Tabelle (heißt: manufacturers) und dort in der Spalte title)?
 
Hallo Mirko_R

das sind Aliase für die Tabellennamen zur Vereinfachung fürs Schreiben. Wenn du

SQL:
SELECT
    title
   ,title
FROM
    article 
JOIN
   manufacturers ON id = id

schreibst, dann kann SQL die Spalten (In diesem Fall Titel und ID) nicht der korrekten Tabelle zuordnen. Um das zu umgehen müsste man es wie folgt schreiben:

SQL:
SELECT
    article.title
   ,manufacturers.title
FROM
    article 
JOIN
   manufacturers ON article.id = manufacturers.id

Da die Programmierer ein schreibfaules Völkchen sind oder mehrmals auf die selbe Tabelle referenzieren (wie in meinem Fall) nutzen wir Aliase.

SQL:
SELECT
    a.title
   ,m.title
FROM
    article as a
JOIN
   manufacturers as m
   ON a.id = m.id

Wie du aber in dem Code bei mir bzw @Biber3 sehen kannst, haben wir den AS-Befehl weggelassen.

Ich hoffe meine Erklärung war verständlich ;)

Gruß, Patrick
 
Hallo,

Dein Code lautete ja:
  1. UPDATE articles a1
  2. SET a1.title = (SELECT CONCAT(a2.title,' ',m1.title) FROM article a2 JOIN manufacturers m1 ON m1.id = a2.id WHERE a1.id = a2.id)
Vollständig müsste das dann lauten (a1=articles, m1=manufacturers):
  1. UPDATE articles
  2. SET articles.title = (SELECT CONCAT(a2.title,' ',manufacturers.title) FROM article a2 JOIN manufacturers.title ON manufacturers.id = a2.id WHERE articles.id = a2.id)
Was ist denn in dem Fall für die Variable a2 einzusetzen?
 
Es sind keine Variablen, sondern Aliase

Ehrlicherweise kann ich deinen Code gerade nicht wirklich lesen (und unformatierten Code lese ich sowieso ungern).

Letztendlich kann man aber folgendes sagen: a1 = a2 = articles
 
Moin Mirko_R,

Kalito hatte dir doch schon den Hinweis auf "ALIAS" gegeben.
Erlaube mir die Ergänzung: Viele Suchmaschinen wissen viel mehr über "SQL ALIAS" als Kaltito, du und ich zusammen. Frag doch da mal.

Zweite Ergänzung: in Kalitos Statement hatte er "kurze" Aliasnamen verwendet wegen Übersichtlichkeit und Schreibfaulheit.

Also so (Kalitos Statement ein bisschen formatiert, sonst unverändert)
SQL:
UPDATE articles a1
SET a1.title = (
         SELECT CONCAT(a2.title,' ',m1.title)
           FROM article a2 JOIN manufacturers m1 ON m1.id = a2.id
           WHERE a1.id = a2.id
           )
;

Es spricht aber nichts dagegen, längere Aliasnamen zu verwenden, wenn es dadurch für dich klarer wird.
SQL:
UPDATE articles AS ArtikelWoIchUpdatenWill
SET ArtikelWoIchUpdatenWill.title = (
         SELECT CONCAT(ArtikelWoIchMitManufacturersJoine.title,' ',manufacturers.title)
           FROM article AS ArtikelWoIchMitManufacturersJoine
           JOIN manufacturers ON manufacturers.id = ArtikelWoIchMitManufacturersJoine.id
           WHERE ArtikelWoIchUpdatenWill.id = ArtikelWoIchMitManufacturersJoine.id
           )
;

Hilft das?

Grüße
Biber
 
Zurück