Problem mit UPDATE und SELECT in MySQL

Problem mit UPDATE und SELECT in MySQL

am 25.07.2006 14:21:14 von benjamin235

Hallo Leute!


Ich bin in SQL Newbie und bin auf ein Problem gestoßen, dass ich nicht
lösen kann. Ich programmiere mit C unter Linux auf MySQL 4.1.X. Also
ich habe 2 SQL-Befehle:

sql_Request =3D "UPDATE test SET ID_Link =3D ID \
WHERE ID IN (SELECT t1.ID \
FROM test t1, test t2 \
WHERE t1.PACKET_ID =3D t2.PACKET_ID \
AND t1.DST_IP =3D t2.SRC_IP \
AND t1.DATE =3D t2.DATE \
AND (t2.TIME - t1.TIME) <=3D 5 * 60 \
AND test.TYPE =3D 'Request')";

und

sql_Response =3D "UPDATE test tt SET ID_Link =3D (SELECT ID \
FROM test t \
WHERE t.PACKET_ID =3D tt.PACKET_ID \
AND t.DST_IP =3D tt.SRC_IP \
AND t.DATE =3D tt.DATE \
AND (tt.TIME - t.TIME) <=3D 5 * 60 \
AND t.TYPE =3D 'Request') \
WHERE ID IN (SELECT t1.ID \
FROM test t1, test t2 \
WHERE t1.PACKET_ID =3D t2.PACKET_ID \
AND t1.SRC_IP =3D t2.DST_IP \
AND t1.DATE =3D t2.DATE \
AND (t1.TIME - t2.TIME) <=3D 5 * 60 \
AND tt.TYPE =3D 'Response')";

Das Problem ist, dass MySQL kein UPDATE und (Sub)Select auf die gleiche
Tabelle zulässt:
Currently, you cannot update a table and select from the same table in
a subquery.

Ich hab auch schon ein Workaround gefunden. Hier mal der Link dazu:
http://www.xaprb.com/blog/2006/06/23...rget-in-mysql/

Das Problem ist, ich checks einfach nicht. Ich hab keinen Plan wie ich
das bei mir anwenden soll. Kann mir da jemand helfen? Ich bin mir
ziemlich sicher dass das so gehen müsste, wie ich es hier geschrieben
habe. Nur MySQL kann das eben nicht und ich kann keine andere Datenbank
verwenden. Bitte helft mir. Ich bin am Verzweifeln!

Re: Problem mit UPDATE und SELECT in MySQL

am 25.07.2006 16:38:11 von Norbert Melzer

Am 25 Jul 2006 05:21:14 -0700 schrieb benjamin235@web.de:

> Ich hab auch schon ein Workaround gefunden. Hier mal der Link dazu:
> http://www.xaprb.com/blog/2006/06/23...rget-in-mysql/
^^^---------+
Tja, kann mir den Link wegen dem da nicht ansehen |

Also kann Dir da auch niemand helfen, zu dem Würgaround, es sei denn er
erkennt zufällig wieder daß die URL bereits in seinen Bookmarks steht, also
bitte gib die URL noch mal vollständig an

Bye Norbert

Re: Problem mit UPDATE und SELECT in MySQL

am 25.07.2006 17:16:46 von benjamin235

Sorry!

Das hab ich nicht gesehen. Hier nochmal der Link:
http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-u pdate-target-in-mysql/

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 09:32:54 von benjamin235

Hallo!


Also ich hab meine Befehle nochmal überarbeitet:

Update Test Set ID_Link =3D ID
Where ID in (Select t1.ID
From (Select * from Test) t1, (Select * from Test) t2
Where t1.Packet_ID =3D t2.Packet_ID
And t1.DST_IP =3D t2.SRC_IP
And t1.Date =3D t2.Date
And (t2.time - t1.time) <=3D 5 * 60
And trim(lower(t1.Type)) =3D 'request'
AND t1.ID_LINK IS NULL);

und

Update Test Set ID_Link =3D (Select ID
From (Select * from Test) as t
Where t.Packet_ID =3D Test.Packet_ID
And t.DST_IP =3D Test.SRC_IP
And t.Date =3D Test.Date
And (Test.time - t.time) <=3D 5*60
And trim(lower(t.type)) =3D 'request')
Where ID in (Select t1.ID
From (Select * from Test) as t1, (Select * from Test) as t2
Where t1.Packet_ID =3D t2.Packet_ID
And t1.SRC_IP =3D t2.DST_IP
And t1.Date =3D t2.Date
And (t1.time - t2.time) <=3D 5*60
And trim(lower(t1.Type)) =3D 'response'
AND t1.ID_Link IS NULL);

Aber wie sollte es auch anders ein, es kommt meine alte Fehlermeldung:

"You can`t specify target table 'test' for update in FROM clause"

Bitte helft mir!

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 10:34:43 von benjamin235

Hallo!

Also die zweite Version meiner SQL-Befehle klappt. Es klappt aber nur
ab einer MySQL-Version, die höher als 4.1 ist!

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 10:51:07 von Frank Schenk

benjamin235@web.de wrote:
> Hallo!
>
> Also die zweite Version meiner SQL-Befehle klappt. Es klappt aber nur
> ab einer MySQL-Version, die höher als 4.1 ist!
>

-> http://dev.mysql.com/doc

Stichwort: Subqueries, Changelog 4.1x
(Subqueries gabs vorher nicht)


gruß, Frank

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 11:10:01 von Thomas Rachel

benjamin235@web.de wrote:

> UPDATE test SET ID_Link = ID \
> WHERE ID IN (SELECT t1.ID \
> FROM test t1, test t2 \
> WHERE t1.PACKET_ID = t2.PACKET_ID \
> AND t1.DST_IP = t2.SRC_IP \
> AND t1.DATE = t2.DATE \
> AND (t2.TIME - t1.TIME) <= 5 * 60 \
> AND test.TYPE = 'Request')";


UPDATE test t1 JOIN test t2 ON
t1.PACKET_ID = t2.PACKET_ID
AND t1.DST_IP = t2.SRC_IP
AND t1.DATE = t2.DATE
SET t1.ID_Link = t1.ID
WHERE (t2.TIME - t1.TIME) <= 5 * 60
AND test.TYPE = 'Request') /* öööhm - welches Test ist hier gemeint? t1
oder t2?


Den 2. Query bekommst Du dann vielleicht selbst hin, wenn Du Dir dies hier
mal durchgelesen hast und verstanden hast, was da passiert bzw. wie es
geht.

Subquerys sind IMHO in den allermeisten Fällen überflüssig - ich habe sie
bisher noch in keiner meiner Anwendungen verwenden müssen...


Thomas
--
Meine Meinung ist Public Domain.
Jeder darf sie sich zu eigen machen.

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 12:35:37 von benjamin235

> UPDATE test t1 JOIN test t2 ON
> t1.PACKET_ID =3D t2.PACKET_ID
> AND t1.DST_IP =3D t2.SRC_IP
> AND t1.DATE =3D t2.DATE
> SET t1.ID_Link =3D t1.ID
> WHERE (t2.TIME - t1.TIME) <=3D 5 * 60
> AND test.TYPE =3D 'Request') /* öööhm - welches Test ist hi=
er gemeint? t1
> oder t2?
>
>
> Den 2. Query bekommst Du dann vielleicht selbst hin, wenn Du Dir dies hier
> mal durchgelesen hast und verstanden hast, was da passiert bzw. wie es
> geht.
>
> Subquerys sind IMHO in den allermeisten Fällen überflüssig - ich ha=
be sie
> bisher noch in keiner meiner Anwendungen verwenden müssen...
>
>
> Thomas
> --
> Meine Meinung ist Public Domain.
> Jeder darf sie sich zu eigen machen.

Hallo!

Also ich habs nun selbst versucht die zweite Query zu schreiben, aber
ich schaff es nicht ganz. Das hier ist mein Versuch:


UPDATE test t1 JOIN test t2 ON
t1.PACKET_ID =3D t2.PACKET_ID
AND t1.DST_IP =3D t2.SRC_IP
AND t1.DATE =3D t2.DATE
SET t1.ID_Link =3D t1.ID
WHERE (t1.TIME - t2.TIME) <=3D 5 * 60
AND trim(lower(t1.TYPE)) =3D 'request'
SET t1.ID_Link =3D t1.ID
t1.PACKET_ID =3D t2.PACKET_ID
AND t1.SRC_IP =3D t2.DST_IP
AND t1.DATE =3D t2.DATE
SET t1.ID_Link =3D t1.ID
WHERE (t1.TIME - t2.TIME) <=3D 5 * 60
AND trim(lower(t1.TYPE)) =3D 'response';

Im Vergleich dazu mal das Original OHNE JOIN:

Update Test Set ID_Link =3D (Select ID
From (Select * from Test) as t
Where t.Packet_ID =3D Test.Packet_ID
And t.DST_IP =3D Test.SRC_IP
And t.Date =3D Test.Date
And (Test.time - t.time) <=3D 5*60
And trim(lower(t.type)) =3D 'request')
Where ID in (Select t1.ID
From (Select * from Test) as t1, (Select * from Test) as t2
Where t1.PacketID =3D t2.PacketID
And t1.SRC_IP =3D t2.DST_IP
And t1.Date =3D t2.Date
And (t1.time - t2.time) <=3D 5*60
And trim(lower(t1.Type)) =3D 'response';

Ich checks einfach nicht und ich hab jetzt viel probiert. Kannst du mir
nochmal helfen?

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 12:53:12 von Thomas Rachel

benjamin235@web.de wrote:

> UPDATE test t1 JOIN test t2 ON
> t1.PACKET_ID = t2.PACKET_ID
> AND t1.DST_IP = t2.SRC_IP
> AND t1.DATE = t2.DATE
> SET t1.ID_Link = t1.ID
> WHERE (t1.TIME - t2.TIME) <= 5 * 60
> AND trim(lower(t1.TYPE)) = 'request'
> SET t1.ID_Link = t1.ID
> t1.PACKET_ID = t2.PACKET_ID
> AND t1.SRC_IP = t2.DST_IP
> AND t1.DATE = t2.DATE
> SET t1.ID_Link = t1.ID
> WHERE (t1.TIME - t2.TIME) <= 5 * 60
> AND trim(lower(t1.TYPE)) = 'response';


Da sind mehrere SET zu viel drin...

UPDATE test tt SET ID_Link = (SELECT ID \
FROM test t \
WHERE t.PACKET_ID = tt.PACKET_ID \
AND t.DST_IP = tt.SRC_IP \
AND t.DATE = tt.DATE \
AND (tt.TIME - t.TIME) <= 5 * 60 \
AND t.TYPE = 'Request') \
WHERE ID IN (SELECT t1.ID \
FROM test t1, test t2 \
WHERE t1.PACKET_ID = t2.PACKET_ID \
AND t1.SRC_IP = t2.DST_IP \
AND t1.DATE = t2.DATE \
AND (t1.TIME - t2.TIME) <= 5 * 60 \
AND tt.TYPE = 'Response')";



wird dann zu


UPDATE test tt JOIN test t ON
t.PACKET_ID = tt.PACKET_ID
AND t.DST_IP = tt.SRC_IP
AND t.DATE = tt.DATE
JOIN test t1 ON tt.ID=t1.ID
JOIN test.t2 ON
t1.PACKET_ID = t2.PACKET_ID
AND t1.SRC_IP = t2.DST_IP
AND t1.DATE = t2.DATE
SET tt.ID_LINK=t.test
WHERE
t.TYPE = 'Request' AND
tt.TYPE = 'Response'
AND (tt.TIME - t.TIME) <= 5 * 60
AND (t1.TIME - t2.TIME) <= 5 * 60

- sofern ich die verschiedenen Ebenen beim Original-Query richtig deute...


Thomas
--
Die Wachstuben in den Wachstuben werden durch Kunststoffflaschen ersetzt,
die durch Ziehen an den Kunststofflaschen geöffnet werden.
(c) 1994, Werner Icking

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 12:53:45 von Frank Schenk

benjamin235@web.de wrote:
> Ich checks einfach nicht und ich hab jetzt viel probiert. Kannst du mir
> nochmal helfen?

Auch Joins gehen in MySQL UPDATE STATEMENTS nicht, das hätte dir aber
auch das Handbuch verraten.

Vielleicht verrätst du ja mal, was du eigentlich machen willst, aus den
verworrenen Subqueries werd ich nicht schlau - ich benutze die
allerdings auch sehr sehr selten - meistens lässt sich die Aufgabe ohne
Subquery erledigen.


gruß, Frank

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 13:11:52 von benjamin235

Frank Schenk schrieb:

> benjamin235@web.de wrote:
> > Ich checks einfach nicht und ich hab jetzt viel probiert. Kannst du mir
> > nochmal helfen?
>
> Auch Joins gehen in MySQL UPDATE STATEMENTS nicht, das hätte dir aber
> auch das Handbuch verraten.
>
> Vielleicht verrätst du ja mal, was du eigentlich machen willst, aus den
> verworrenen Subqueries werd ich nicht schlau - ich benutze die
> allerdings auch sehr sehr selten - meistens lässt sich die Aufgabe ohne
> Subquery erledigen.
>
>
> gruß, Frank


Hallo!

Also dieses Beispiel mit dem JOIN geht aber bei mir. Auch auf der 4.X
Version. Es hat geklappt und es wird alles so eingetragen wie ich das
will. Das mit den Subqueries ging nur auf der Version 5.X von MySQL.

Also meine Aufgabe ist es in einer DB-Tabelle einen ID_Link hinein zu
schreiben. Die Tabelle sieht so aus:
ID - TYPE - DATE - TIME - SRC_IP - DST_IP - PACKET_ID - ID_Link

ID ist auto_increment, in TYPE stehen nur entweder "Request" oder
"Response". In DATE steht das Datum an dem ein Request/Response
zustande gekommen ist. Das gleiche gilt für TIME. In PACKET_ID steht
eine Zahl (welches Paket der Request/Response war). Und in ID_Link soll
nun die gleiche ID eingetragen werden, wie ein Request hat. Mit der
Bedingung, dass der Response der zu dem Request passt die selbe
PACKET_ID hat, innerhalb einer bestimmten Zeit (ich nehme 5 Minuten)
auftaucht und dass beim Response in der DST_IP die selbe IP steht wie
beim Request in der SRC_IP. Natürlich muss im Response auch noch die
selbe SRC_IP stehen wie im Request die DST_IP. Kann man das so
einigermaßen verstehen?

Re: Problem mit UPDATE und SELECT in MySQL

am 26.07.2006 13:27:15 von benjamin235

Hallo Thomas!


Danke vielmals! Auch der zweite Befehl hat geklappt. Okay es waren ein
zwei kleinere Fehlerchen drin (nur weil du dich da verschrieben hast)
aber alles läuft nun zu meiner Zufriedenheit. Bin dir unendlich
dankbar!!!!!