Bestimmte Teile einer Tabelle in eine andere kopieren / überschreiben

pudem

Neuer Benutzer
Beiträge
4
Hallo,

Ich bin ein SQL-Anfänger und komme ins Schwimmen mit einem Befehl und komme so nicht weiter.

Ausgangspunkt ist folgende Tabelle phpcount_hits:

phpcount_hits.png


Jetzt möchte ich Teile des Inhaltes in eine andere Tabelle - ich nenne sie phpcount_gesamttabelle - einfügen. Sie sieht so aus:

gesamttabelle_vorher.png


Und zwar soll der Inhalt von hitcount, wenn unique 1 ist, für die jeweilige rartid in die Spalte "11" eingetragen werden. Die voreingestellte Null soll dabei überschrieben werden. Wenn die entsprechende rartid in der gesamttabelle nicht existiert (in diesem Fall 7), soll sie ignoriert werden. Das Ergebnis sollte dann so aussehen:

gesamttabelle_nachher.png


Ich habe schon ein bisschen rumprobiert:

UPDATE phpcount_gesamttabelle
SET 11=
????
SELECT rartid,hitcount FROM phpcount_hits WHERE (isunique=1)

Weiter komme ich nicht. Geht das, dass ich das mit einem einzigen SQL-Befehl hinkriege?
 
Werbung:
Hallo,

Ich bin ein SQL-Anfänger und komme ins Schwimmen

Verständlich. Da scheint einiges komplett falsch zu sein. In Deine Ausgangstabelle ist schon mal kein eindeutiger Schlüssel erkennbar. Numerisch durchnummerierte Spalten sind auch ein Indiz für Fehler.

Vereinfacht gesagt hast Du:

Code:
test=# select * from quelle ;
 id | val
----+-----
  1 |  10
  2 |  12
(2 rows)

Time: 0,153 ms
test=*# select * from ziel;
 id | col
----+-----
  1 |
(1 row)

und suchst

Code:
test=*# insert into ziel select * from quelle where id not in (select id from ziel);
INSERT 0 1
Time: 0,321 ms
test=*# update ziel set col = q.val from quelle q where ziel.id=q.id;
UPDATE 2

das liefert:

Code:
test=*# select * from ziel;
 id | col
----+-----
  1 |  10
  2 |  12
(2 rows)

Das war jetzt vereinfacht.

Okay, ich seh grad: das INSERT kannst Dir wohl sogar sparen, nach Deiner Vorgabe.
 
Vielen Dank. Das mit der neuen Variable q kannte ich noch nicht. Ich habe das mal auf meinen Fall angewendet und in phpmyadmin als SQL-Zeile eingegeben:

Code:
update phpcount_gesamttabelle
set 11=q.hitcount
from phpcount_hits q
where phpcount_gesamttabelle.rartid=q.rartid;

Da kommt dann folgende Fehlermeldung:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '11=q.hitcount from phpcount_hits q where phpcount_gesamttabelle.rartid=q.rart' at line 2

Komisch. Also habe ich Dein vereinfachtes Beispiel komplett nachgebaut. Wenn ich den ersten SQL-Befehl eingebe:

Code:
insert into ziel select * from quelle where id not in (select id from ziel);

Dann geht alles glatt, (es wird in ziel die zweite zeile von quelle kopiert), aber wenn ich den zweiten Befehl eingebe:

Code:
update ziel
set col=q.val
from quelle q
where ziel.id=q.id;

Dann kommt wieder:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from quelle q where ziel.id=q.id' at line 3

Das versteh ich jetzt überhaupt nicht! Komisch ist auch, dass die beiden Fehlermeldungen sich auf unterschiedliche Zeilen beziehen (line 2 beim ersten Bsp. und line3 beim zweiten)
 
Zuletzt bearbeitet:
Nachtrag:

Du hattest Recht mit den nummerischen Spaltennamen: Wenn ich "11" in "m11" umbenenne, dann kommt auch die Fehlermeldung, allerdings für Zeile 3, d.h. das Problem liegt in der Zeile

Code:
from phpcount_hits q

Aber was ist da falsch?
 
Nachtrag:

Du hattest Recht mit den nummerischen Spaltennamen: Wenn ich "11" in "m11" umbenenne, dann kommt auch die Fehlermeldung, allerdings für Zeile 3, d.h. das Problem liegt in der Zeile

Code:
from phpcount_hits q

Aber was ist da falsch?

MySQL. Das ist sprachbehindert und versteht SQL gemäß der SQL-Spezifikation manchmal nicht und manchmal falsch.

Du suchst sowas wie

Code:
update ziel,quelle set ziel.val=quelle.val where quelle.id=ziel.id;

Zu den nummerierten Spalten: da ein 'm' vorzuschreiben mag gegen den Syntaxfehler helfen, das ginge aber auch durch Quoting. Das Problem ist der Aufbau der Tabellen. Du hast 12 Spalten, weil es 12 Monate gibt. Wenn Du das nach dem Schema für jeden Tag eines Jahres machen willst brauchst 365,25 Spalten, soll es für 10 Jahre reichen dann 3652,5 Spalten. Und da ist es noch einfach, was machst Du du, wenn Du für jeden Kunden eine Spalte haben willst? Du siehst also, das kann so nicht richtig funktionieren. Dafür wurden die Regeln der Normalisierung geschaffen. Die gelten auch für MySQL.

Ach ja: Du bist Anfänger, vielleicht ist es ja noch nicht zu spät Dich vor MySQL zu warnen und Dir bessere Alternativen wie z.B. PostgreSQL zu empfehlen.
 
Danke für den Code. Angewendet für meinen Fall wäre das dann:

Code:
update phpcount_gesamttabelle,phpcount_hits set phpcount_gesamttabelle.m11=phpcount_hits.hitcount where (phpcount_hits.rartid=phpcount_gesamttabelle.rartid) AND (phpcount_hits.isunique=1);

So funzt es. Super!

Die Fälle, die Du beschrieben hast, treffen für mich nicht zu. "Kunden" gibt es bei mir nicht - es geht um eine Statistik, die auf Monatsbasis (Tagesbasis eräbe kaum einen Sinn) laufen soll, d.h. an der Struktur wird sich nichts ändern. Die Jahre kriege ich ja über die Zeilen.

Was "Normalisierung" und "Quoting" ist, weiß ich nicht. Ehrlich gesagt wurschtel ich immer so lange rum, bis es funktioniert . weiter gehe ich nicht. Auch was an PostgreSQL besser sein soll als MySQL - keinen Schimmer (Ich hab mal was von fehlender "refentieller Integrität" bei MySQL gehört und kann mir sogar was drunter vorstellen, aber so einfach wie meine Daten aufgebaut sind, brauche ich das nicht)! Aber ein Profi wie Du wird schon seine Gründe haben! Fakt ist aber, dass alle Provider in erster Linie MySQL anbieten, das ist ja Quasistandard. Bisher hatte ich damit auch keine Probleme. Also kann es soooo schlecht ja auch nicht sein.
 
Werbung:
Danke für den Code.

So funzt es. Super!

Bitte.

Die Fälle, die Du beschrieben hast, treffen für mich nicht zu. "Kunden" gibt es bei mir nicht - es geht um eine Statistik, die auf Monatsbasis (Tagesbasis eräbe kaum einen Sinn) laufen soll, d.h. an der Struktur wird sich nichts ändern. Die Jahre kriege ich ja über die Zeilen.

Was "Normalisierung" und "Quoting" ist, weiß ich nicht.

Daran solltest Du arbeiten, dies zu ändern.

Ehrlich gesagt wurschtel ich immer so lange rum, bis es funktioniert . weiter gehe ich nicht. Auch was an PostgreSQL besser sein soll als MySQL - keinen Schimmer
Sehr vieles. Du wirst es merken, wenn Du eines Tages mal vom Niveau des rumwurschteln höher kommen willst.

(Ich hab mal was von fehlender "refentieller Integrität" bei MySQL gehört und kann mir sogar was drunter vorstellen, aber so einfach wie meine Daten aufgebaut sind, brauche ich das nicht)!

Das kann es mittlerweile sogar, also in InnoDB, und wenn man es gezielt nutzt. Also nicht nur rumwurschtelt.

Aber ein Profi wie Du wird schon seine Gründe haben! Fakt ist aber, dass alle Provider in erster Linie MySQL anbieten, das ist ja Quasistandard. Bisher hatte ich damit auch keine Probleme. Also kann es soooo schlecht ja auch nicht sein.

Ich arbeite bei einem Provider, und ja, sehr viele nutzen MySQL. Und ich sehe auch, welche Probleme insbesondere bei wachsenden Projekten damit bestehen. Von daher kommt dann auch meine Einstellung.
 
Zurück
Oben