Webstatt.org - Community seit 2006 - 2012 (2024?)

SQL Syntaxfehler

user-303
29.08.2007 13:45

Hallo zusammen, ich steh grad bischen aufm Schlauch.

Vorhaben: Tabellen aufräumen.
Da ich in dem gegebenen Framework ( WCF ) nicht abfangen kann, wenn ein User gelöscht wurde, muss ich mittels zeitgesteuerten Aufträgen die Datenbank aufräumen.

Tabellenstruktur:
CREATE TABLE `wcf1_comc_blog_comments` (
`commentID` int(10) NOT NULL auto_increment,
`itemID` int(10) NOT NULL,
`userID` int(10) NOT NULL,
`username` varchar(255) NOT NULL,
`comment` text NOT NULL,
`time` int(10) NOT NULL,
PRIMARY KEY (`commentID`)
) ENGINE=MyISAM;


CREATE TABLE `wcf1_comc_blog_items` (
`itemID` int(10) NOT NULL auto_increment,
`userID` int(10) NOT NULL,
`categoryID` int(10) NOT NULL,
`subject` varchar(255) NOT NULL,
`text` text NOT NULL,
`time` int(10) NOT NULL,
PRIMARY KEY (`itemID`)
) ENGINE=MyISAM;


Nun ist zu beachten: die userID aus den Kommentaren bezieht sich auf den User, der den Kommentar geschrieben hat. um also alle Kommentare, die für einen User gegeben wurden zu löschen, muss ein Umweg über die items Tabelle gegangen werden.
Ich versuche das Problem so zu lösen:

DELETE FROM wcf1_comc_blog_comments c
LEFT JOIN wcf1_comc_blog_items i USING(itemID)
LEFT JOIN wcf1_user u ON(i.userID=u.userID) WHERE u.userID is NULL

Doch der MySQL Server meint:
#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 'LEFT JOIN wcf1_comc_blog_items i USING(itemID)
LEFT JOIN wcf1_user u ON(i.userI' at line 2


Irgendwie seh ich den Syntaxfehler nur nicht?
Warum ich übrigends das letzte mal ein ON statt einem USING nehm: userID ist ja doppelt, einmal in comments und einmal in items. deswegen muss definiert werden, welches userID er vergleichen soll

Meine alternative wäre: in die comments tabelle "einfach" noch eine weitere spalte hinzuzufügen, in der die userID des schreibers des Blogs steht, um es dann nacher komfortabel zu löschen.

Ich bin user-158kbar für jede Hilfe

user-343
29.08.2007 14:57

Und wenn du beim ersten Join *nicht* Using gebrauchst?
Bei Zwei Joins hatte ich auch immer Probleme, wenn ich Using gebraucht habe, die Spalte aber nur in 2 der 3 Tabellen war.

user-303
29.08.2007 15:14

gleicher fehler beim ON.

allerdings hatte ich noch nie probleme mit USING. und ich hab querys die gehen über 5 und mehr tabellen...

Avatar user-236
29.08.2007 17:27

stell mal deine anfrage ein bisschen um:


delete from wcf1_comc_blog_comments AS u
from wcf1_comc_blog_comments c
.................


geht irgendwie auch mit NOT EXITS lächeln

signature in progress
user-343
29.08.2007 17:41

Klammern weglassen. On setzt keine Klammern vorraus.

user-303
01.09.2007 11:51

hab es inzwischen auf mehrere verschiedene wege versucht, im delete zu joinen. scheinbar geht das nicht.

also selecte ich nun einfach und lösch dann in der schleife...unschön aber da es eh en cronjob is wayne

user-343
01.09.2007 14:51

Hast du auch die Klammern bei ON weggelassen, wie ich empfohlen habe? ON ist keine Funktion wie USING(), also entweder ganz weglassen oder einen Leerschritt dazwischen stellen. Wobei bei einem Argument die Klammern überflüssig sind.

Avatar user-236
01.09.2007 14:52

weiß auch nicht, dein join müsst doch eigentlich gehen..


DELETE FROM wcf1_comc_blog_comments
FROM wcf1_comc_blog_comments c LEFT JOIN wcf1_comc_blog_items i
ON c.itemID = i.itemID
LEFT JOIN wcf1_user u
ON i.userID=u.userID
WHERE u.userID is NULL


kannst aber auch mal ein zwei datensätze mit tabellen struktur hier posten, dann übertrag ich das in toad und test mal. würd mich schon interessieren wie der join ausschaut zwinkern

noch besser ist es aber, wenn du dir die ganzen cronjobs und das nachsäubern sparst. falls es überhaupt geht, dann lass die kommentare doch gleich automatisch löschen, wenn ein user aus dem system gelöscht wird.

signature in progress
user-303
01.09.2007 15:03

Original von user-343
Hast du auch die Klammern bei ON weggelassen, wie ich empfohlen habe? ON ist keine Funktion wie USING(), also entweder ganz weglassen oder einen Leerschritt dazwischen stellen. Wobei bei einem Argument die Klammern überflüssig sind.

hab ich probiert, half nicht.

Original von user-236
noch besser ist es aber, wenn du dir die ganzen cronjobs und das nachsäubern sparst. falls es überhaupt geht, dann lass die kommentare doch gleich automatisch löschen, wenn ein user aus dem system gelöscht wird.


da verweise ich auf mein startpost, in dem ich schrieb:

Original von user-303
Da ich in dem gegebenen Framework ( WCF ) nicht abfangen kann, wenn ein User gelöscht wurde, muss ich mittels zeitgesteuerten Aufträgen die Datenbank aufräumen.