Tabellen beim insert joinen

claireannelage

Grünschnabel
Hallo,
ich möchte eine Abfrage durchführen, bei der Einträge abhängig vom Schlüssel in einer anderen Tabelle sind. Beispiel - ich habe eine membertabelle und möchte nun den membern eine Nachricht schicken (messagetabelle) die in der Tabelle Status einen bestimmten Wert haben- bzw eine Nachricht an alle user schicken.
Ich hatte mir die Abfrage in etwa so vorgestellt:
Code:
$sql="insert into pmessages (...) values (...)
 join member on member.id=pmessages.recipient
join status on status.userid=member.id
where status.stat_hp >=3"
Hat aber nicht geklappt - daher wollte ich erstmal sehen dass ich eine Nachricht an alle user schreiben kann.
Ich habe es mit der Abfrage
Code:
$sql=insert into pmessages (...) values (...) join member on member.id = pmessages.recipient
Jedoch wird nur eine Zeile eingefügt. Eine Frage dazu - kann man bei Inserts die Tabellen genauso joinen wie bei Selects ?

Danke schonmal im Vorraus ;)
 
Versuchs mal mit einer unterkorrelierten abfrage im insert statement :

INSERT INTO mytable (Col1,Col2) VALUES ('Wert1','Wert2')
where X =(Select .... )
 
Machs über INSERT INTO...SELECT anstelle eines INSERT INTO...VALUES...

Das geht bei den Meisten DB. Ich geh mal davon aus, dass du eine MySQL hast.

SQL:
INSERT INTO myTable (wert1, wert2, wert3)
SELECT
    t.wert1,
    t.wert2,
    'foo' AS wert3
FROM
    myOtherTable AS t
WHERE
    t.feld3 = 'bar'
 
Zuletzt bearbeitet von einem Moderator:
ich bekomme das mit dem select - Teil nicht so ganz hin.
Ich habe es folgendermassen versucht:
Angenommen es gibt eine Tabelle user und eine tabelle messages. Ich möchte nun in die Tabelle messages eine Nachricht für alle userid's eintragen. Dabei geh ich der Einfachheithalber nur davon aus dass ich nur einen Wert eintragen will, den Wert message.
Tabelle user hat das Feld user.id
Tabelle messages hat das Feld messages.mcontent und messages.userid

Nun sollen alle user dieselbe message erhalten. So wie ich es verstanden habe müsste die Abfrage dann lauten:
PHP:
$message="irgendeintext";
$sql= "insert into messages ('mcontent')
select $message as messages.mcontent
from user 
where member.id=messages.userid";

Leider sieht meine Datenbank das anders und spuckt mir einen Syntaxfehler aus.:(
 
[ironie]Oh, eine Fehlermeldung. Interessant. Sollen wir sie erraten?[/ironie]

Ne, ernsthaft. Wir kennen deine DB-Struktur nicht. ABer Fehlermeldungen enthalten häufig wichtige Informationen zum Fehler.
Wenn ich raten müsste, würd ich sagen:
item: dass du im SELECT keinen Alias mit Tabellen-Preffix setzen kannst.
item: dass du so das select so nicht brauchst, da du ja nur eine Message in dei messages-Tabelle einfügst und keinerlei Informationen aus user ausliest, geschweige dann mit messages verknüpfst.
 
die Fehlermeldung lautet #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 ... und dann kommt die ganze Abfrage - die nur eine Zeile hat also nutzt mir die Angabe dass der Fehler in Zeile 1 ist wenig.

Ich will auch nicht das was ich einfügen will aus einer anderen Tabelle auslesen, sondern die Bedingung - eigentlich sollen die Bedingungen sogar aus 2 Tabellen ausgelesen werden, mir ging es hier mehr um das reine Verständnis der Abfrage - war aber nicht wirklich durchdacht weil ich ja die id's auf jeden Fall dann als Wert auch übergeben muss.

Vielleicht ist es so verständlicher:
Eigentlich habe ich 3 Tabellen - member, status, messages.
Wie sehe die Abfrage aus wenn ich die messages nur an user mit einem bestimmten Status (zb > 2 ) schicken will ?
 
Die Fehlermeldung sagt lediglich, dass Du in deinem Statement etwas falsch geschrieben hast. Was es ist kann man ohne Kenntnis des Statements und dem Aufbau der betroffenen Tabellen nicht sagen.
 
PHP:
$sql= "insert into messages ('mcontent')

Sollte so aussehen wie Yaslaw schon in seinem Beispiel gezeigt hat:
PHP:
$sql= "insert into messages (mcontent)
 
Ich hab die Abfrage nun nach der Anleitung von yaslaw geändert - es hapert nur noch am Operator
PHP:
	$sqlab="insert into pmessages (senderid,message,recipient,send)
				select ".$_SESSION['id']." as 'pmessages.senderid' ,
				'".$msg."' as 'pmessages.message',
				member.id as 'pmessages.recipient',
				NOW() as 'pmessages.send'
				from member
				where
				member.active = 1";

Diese Abfrage erzeugt leider nicht das gewünschte Ergebnis, hingegen
PHP:
	$sqlab="insert into pmessages (senderid,message,recipient,send)
				select ".$_SESSION['id']." as 'pmessages.senderid' ,
				'".$msg."' as 'pmessages.message',
				member.id as 'pmessages.recipient',
				NOW() as 'pmessages.send'
				from member
				where
				member.active > 0";
tut es, wobei active ein Set-Feld ist dass nur 0 und 1 annehmen kann. Wieso erzeugen die beiden Abfragen unterschiedliche Ergebnisse ?
Wie müsste der Operator sein wenn die where - Bedingung (zb die userid) eine Abfolge von Zahlen ist ?
also
PHP:
where member.id = 1 or member.id =4 or member.id=6
wird sicher nicht die richtige Schreibweise sein ?
 
Wenn es ein SET-Feld ist, müsstest Du den Wert als String vergleichen.

PHP:
$sqlab="insert into pmessages (senderid,message,recipient,send)
                select ".$_SESSION['id']." as 'pmessages.senderid' ,
                '".$msg."' as 'pmessages.message',
                member.id as 'pmessages.recipient',
                NOW() as 'pmessages.send'
                from member
                where
                member.active = '1'";
 
Zurück