Hallo zusammen,
ich weiß nicht ob jemand Refbase (http://www.refbase.net) kennt, dann
wäre es sicher verständlicher. Aber ich versuche es verständlich zu
erklären.
Es gibt eine Tabelle *User* das stehen die user_id drin.
Je nach Login werden die Daten mit der gleichen user_id, die in Tabelle
*user_data* stehen dem user zur Verfügung gestellt.
user_data:
data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes
user_file,user_groups,cite_key,related
User 11 bekommt also die Daten die in Tabelle User_data - user_id 11
haben angezeigt.
wie kann ich die Daten z.B User 12 also user_id=12 zur Verfügung
stellen, aber nur mit den Feldern
record_id,user_file,related
und nur diejenigen die im Feld user_file ein pdf file haben also ".pfd"
im Feld vorhanden ist
bei denen die Record Id schon vorhanden ist müsste nur das Feld user
file kopiert werden.
data_id ist das auto_increment Feld
Ich habe keinen Plan mit wie vielen und welchen Schritten ich das machen
kann. Insgesamt sind es ca 500 Datensätze von 3500
Ich habe eine lokale Datenbankkopie um solche Dinge erst auszuprobieren
Wissensstand:
einfache SQL Befehle wie
update ... set ... where
delete from ... where ... rlike
usw.
Hoffentlich war das nachvollziehbar ...
Viele GRüße Knut
SELECT record_id, user_file, related FROM user_data WHERE data_id=12 AND
user_file like '%.pfd'
> bei denen die Record Id schon vorhanden ist müsste nur das Feld user
> file kopiert werden.
>
Häh? Warum willst Du denn jetzt was kopieren? Und wohin soll dieses Feld
kopiert werden?
>
> data_id ist das auto_increment Feld
>
...
>
> Hoffentlich war das nachvollziehbar ...
Nicht wirklich - wenn Du etwas weniger Prosa und etwas mehr beispielhaft
"das habe ich", "das will ich" schriebest, wäre es verständlicher.
"Nachvollziehbar" verstehe ich ohnehin nicht.
Das habe ich
data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes,user_file,user_groups,cite_key,related
data_id=autoincrement
user_id= 11
record_id=123
.....
user_file=*.pdf
das möchte ich
neuen Record:
data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes,user_file,user_groups,cite_key,related
data_id=autoincrement
user_id= 12
record_id=123
..... nicht kopieren ....
user_file=*.pdf
... nicht kopieren
aber nur wenn Record 123 und user_id=12 nicht vorhanden und Feld
user_file ".pdf" enthält
Record 123 und user_id=12 vorhanden Feld user_file kopieren,
aber das letzte bekomme ich auch alleine hin.
Grüße Knut
Abschnitt zu "INSERT INTO", Unterabschnitt zu INSERT INTO ... SELECT
INSERT INTO bla (user_id, record_id, ..., user_file) SELECT FROM bla
12, record_id, ..., user_file
> aber nur wenn Record 123 und user_id=12 nicht vorhanden und Feld
> user_file ".pdf" enthält
>
Verstehe ich wieder nicht. Wenn Du einen neuen Datensatz erzeugen
willst ("neuer Record"), dann sind doch dessen Felder per
definitionem leer. Sonst wäre es ja kein neuer Datensatz. Wo also soll
nun "record 123 nicht vorhanden" sein (Du meinst ja vermutlich, dass
in record *nicht* 123 stehen soll).
Oder meinst Du "Der neue Datensatz soll nur erzeugt werden, wenn es
noch keinen Eintrag für user_id 12 gibt, bei dem record=123 ist und in
user_file was steht"?
Zumindest die ersten beiden Bedingungen würde ein unique index auf
(user_id, record) erledigen.
>
> Record 123 und user_id=12 vorhanden Feld user_file kopieren,
> aber das letzte bekomme ich auch alleine hin.
>
Vielleicht hilft Dir dev.mysql.com/doc weiter, und zwar der Abschnitt
zu "REPLACE"?
--
Christian
> dev.mysql.com/doc
>
> Abschnitt zu "INSERT INTO", Unterabschnitt zu INSERT INTO ... SELECT
>
> INSERT INTO bla (user_id, record_id, ..., user_file) SELECT FROM bla
> 12, record_id, ..., user_file
Damit habe ich es eben nicht komplett hinbekommen ...
Insert into, Select from, usw verwende ich ja laufen, aber eben nur für
einfachere Aufgaben.
> Am 11.10.2007 19:25 schrieb Knut Krueger:
> Oder meinst Du "Der neue Datensatz soll nur erzeugt werden, wenn es
> noch keinen Eintrag für user_id 12 gibt, bei dem record=123 ist und in
> user_file was steht"?
>
> Zumindest die ersten beiden Bedingungen würde ein unique index auf
> (user_id, record) erledigen.
>
vielleicht doch etwas Prosa damit wir uns nicht missverstehen ;-)
Erst wenn ein User etwas zu dem Datensatz z.B 123 in seine persönlichen
Felder was eingetragen hat wird der Datensatz angelegt.
Ich darf also nichts daran ändern falls er schon vorhanden ist außer das
Feld user_file.
Ist er nicht vorhanden muss ich ihn anlegen mid User_ID 12 und die o.a
Felder füllen.
ist er da nur das Feld user_file.
Viele Grüße Knut
viele Grüße Knut
Zu ersterem kann ich nichts sagen, da letzteres zutrifft.
Ich versuchs nochmal
Tabelle:
data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes,user_file,user_groups,cite_key,related
data_id=autoincrement
Kopiere die Inhalte der Felder record_id,related,user_file aller
Datensätz mit user_id x, die im Feld User_file "pdf" enthalten, in einen
neuen Datensatz und tausche User_id x gegen y;
Ist schon ein Datensatz mit user_id y und gleicher record_id vorhanden
kopiere nur den Inhalt des Feldes user_file
Viele Grüße Knut
ROFL.
> Tabelle:
> data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes,user_file,user_groups,cite_key,related
> data_id=autoincrement
>
> Kopiere die Inhalte der Felder record_id,related,user_file aller
> Datensätz mit user_id x, die im Feld User_file "pdf" enthalten, in einen
> neuen Datensatz und tausche User_id x gegen y;
>
> Ist schon ein Datensatz mit user_id y und gleicher record_id vorhanden
> kopiere nur den Inhalt des Feldes user_file
>
> Viele Grüße Knut
vereinfachte Tabelle und mit PostgreSQL, ob MySQL das so kann weiß ich nicht.
test=# select * from knut;
uid | rid | file
-----+-----+------
(0 rows)
test=# insert into knut values (1,1,'pdf');
INSERT 0 1
test=# insert into knut (uid, rid, file) select 2, k.rid, k.file from knut k, (select count(1) from knut where uid=2) c where k.uid=1 and c.count=0;
INSERT 0 1
test=# insert into knut (uid, rid, file) select 2, k.rid, k.file from knut k, (select count(1) from knut where uid=2) c where k.uid=1 and c.count=0;
INSERT 0 0
test=# select * from knut;
uid | rid | file
-----+-----+------
1 | 1 | pdf
2 | 1 | pdf
(2 rows)
test=# update knut set file='foo' where uid=1;
UPDATE 1
test=# insert into knut (uid, rid, file) select 2, k.rid, k.file from knut k, (select count(1) from knut where uid=2) c where k.uid=1 and c.count=0;
INSERT 0 0
test=# update knut set file=(select file from knut where uid=1) where uid=2;
UPDATE 1
test=# select * from knut;
uid | rid | file
-----+-----+------
1 | 1 | foo
2 | 1 | foo
(2 rows)
end
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
> Tabelle:
> data_id,user_id,record_id,marked,copy,selected,user_keys,user_notes,user_file,user_groups,cite_key,related
> data_id=autoincrement
>
> Kopiere die Inhalte der Felder record_id,related,user_file aller
> Datensätz mit user_id x, die im Feld User_file "pdf" enthalten, in einen
> neuen Datensatz und tausche User_id x gegen y;
>
> Ist schon ein Datensatz mit user_id y und gleicher record_id vorhanden
> kopiere nur den Inhalt des Feldes user_file
Ich versuch's mal:
INSERT Tabelle (user_id, record_id, related, user_file)
SELECT 'y', record_id, related, user_file FROM Tabelle
WHERE user_id = 'x' AND user_file LIKE '%pdf%'
ON DUPLICATE KEY UPDATE user_file = VALUES(user_file);
Ohne Gewähr und ungetestet :-)
Gruß. Claus
Vielen Dank
Knut
p.s
Mein Motherboard auf dem mein Xammp mit Datenbank installiert ist gerade
abgeraucht. Auf der orginal Datenbank möchte ich das jetzt nicht
unbedingt testen ;-)
Wenn ich ein neues MB habe melde ich mich wieder
> Mein Motherboard auf dem mein Xammp mit Datenbank installiert ist
> gerade abgeraucht. Auf der orginal Datenbank möchte ich das jetzt
> nicht unbedingt testen ;-)
> Wenn ich ein neues MB habe melde ich mich wieder
Ich hätte da gerade noch 'n schönes Maschinchen abzugeben :-)
IBM xSeries 345, 2x 2 Ghz Xeon DP, 2 GB Ram, 6x 73 GB an Array 4Lx, 2x GB Lan, Remotemanagement
Cu, Andreas
--
**************************************************************************************************
Persönliche Antworten bitte an a99b...@remote.dyndns.info, die
Replyadresse wird nicht gelesen ! Mails bitte als Nur Text Senden !!
Send Private-Messages only to a99b...@remote.dyndns.info, the reply
adress will not be read ! Please send only as Plaintext !!
so weit alles klar und funktioniert zum kopieren (natürlich mit Werten
für x,y und Tabelle)
> ON DUPLICATE KEY UPDATE user_file = VALUES(user_file);
nur hier kommt die Meldung:
User_file ambiguous
Da kann ich derzeit nichts mit anfangen
Viele Grüße Knut
> Claus Reibenstein schrieb:
>
>> INSERT Tabelle (user_id, record_id, related, user_file)
>> SELECT 'y', record_id, related, user_file FROM Tabelle
>> WHERE user_id = 'x' AND user_file LIKE '%pdf%'
>
> so weit alles klar und funktioniert zum kopieren (natürlich mit Werten
> für x,y und Tabelle)
>
>> ON DUPLICATE KEY UPDATE user_file = VALUES(user_file);
>
> nur hier kommt die Meldung:
> User_file ambiguous
Das ist merkwürdig. Laut Dokumentation sollte es genau so funktionieren.
Oder habe ich etwas übersehen?
Probier mal diese Variante:
INSERT Tabelle (user_id, record_id, related, user_file)
SELECT 'y', record_id, related, user_file FROM Tabelle t2
WHERE user_id = 'x' AND user_file LIKE '%pdf%'
ON DUPLICATE KEY UPDATE user_file = t2.user_file;
Also mit Hilfe eines Alias im SELECT und einer Referenz auf diesen Alias
statt der VALUES-Funktion.
Gruß. Claus
INSERT user_data(user_id, record_id, related, user_file)
SELECT '3', record_id, related, user_file FROM user_data t2
WHERE user_id = '11' AND user_file LIKE '%pdf%'
ON DUPLICATE KEY UPDATE user_file = t2.user_file
Antwort: 1110 - Column 'user_file' specified twice
Viele Grüße Knut
Fehlt da nicht ein komma?
FROM user_data, t2
Bernhard
Nur mal als Zwischenfrage: wann wurde denn das 'INSERT INTO'
abgeschafft?
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
> Claus Reibenstein <4spamm...@web.de> wrote:
>
>> INSERT Tabelle (user_id, record_id, related, user_file)
>
> Nur mal als Zwischenfrage: wann wurde denn das 'INSERT INTO'
> abgeschafft?
Gar nicht.
Gruß. Claus
Wunderte mich. Hab zwar nicht im 2003er Standard nachgeschaut aber
in SQL99 war noch explizit "INSERT INTO" definiert.
> Wunderte mich. Hab zwar nicht im 2003er Standard nachgeschaut aber
> in SQL99 war noch explizit "INSERT INTO" definiert.
Meines Wissens war INTO schon immer optional. Allerdings habe ich keinen
Standard hier, um das zu prüfen. Zumindest in MySQL 4.0 war es schon so.
Gruß. Claus
----- aus SQL1998 -----
13.8 <insert statement>
Function
Create new rows in a table.
Format
<insert statement> ::=
INSERT INTO { <table reference> | CURSOR <cursor name> }
<insert columns and source>
______________________________________________________________
ANSI Only-caused by ISO changes not yet considered by ANSI
______________________________________________________________
----- aus SQL1998 -----
Ich sehe da nicht, das 'INTO' optional wäre, lasse mich aber gern eines
besseren belehren.
Das Mysql dies optional gestaltet, wundert mich irgendwie nicht,
war aber auch nicht Gegenstand meiner Frage.
Abgesehen davon funktioniert die "Kurzform" selbst im Strict Mode,
was dann wohl falsch ist.
> Claus Reibenstein <4spamm...@web.de> wrote:
>
>> Meines Wissens war INTO schon immer optional. Allerdings habe ich keinen
>> Standard hier, um das zu prüfen. Zumindest in MySQL 4.0 war es schon so.
>
> ----- aus SQL1998 -----
>
> [...]
> <insert statement> ::=
> INSERT INTO { <table reference> | CURSOR <cursor name> }
> [...]
>
> Ich sehe da nicht, das 'INTO' optional wäre, [...]
Ich auch nicht :-)
Danke für die Info.
Gruß. Claus
INSERT user_data(user_id, record_id, related, user_file) SELECT '3',
record_id, related, user_file FROM user_data, t2 WHERE user_id = '11'
AND user_file LIKE '%pdf%' ON DUPLICATE KEY UPDATE user_file = t2.user_file
SQL meldet:
#1146 - Table 'refdb.t2' doesn't exist
Viele Grüße Knut
> Am Fri, 26 Oct 2007 11:04:26 +0200 schrieb Knut Krueger:
>
>> INSERT user_data(user_id, record_id, related, user_file)
>> SELECT '3', record_id, related, user_file FROM user_data t2 WHERE
>> user_id = '11' AND user_file LIKE '%pdf%' ON DUPLICATE KEY UPDATE
>> user_file = t2.user_file
>
> Fehlt da nicht ein komma?
> FROM user_data, t2
Nein.
Gruß. Claus