Kermit: bei insert into table einzelne ids weglassen

Hallo,
arbeite mit php5 und mysql(glaube 4.1. version im echtsystem und 5.0.22 im testsystem....)

habe eine Tabelle Bestellung mit
bestell_id, kunden_id, produkt_id, bestell_datum

Wenn eine neue Bestellung aufgegeben wird geht das Produkt an alle Kunden!
Wähle also ein Produkt aus und sag bestellen.
Als erstes wird abgefragt ob schon Kunden dieses Produkt bekommen haben, wenn nicht wird der Bestellvorgang weitergeleitet, soweit auch kein Problem.
Wenn Kunden gefunden werden, die das Produkt schon bekommen haben, wird eine Liste dieser Kunden angezeigt mit einer Dropdown-Auswahl für ein neues Produkt für den jeweiligen Kunden.
So und jetzt fängt mein Problem an:
Die Kunden die schon das original gewählte Produkt bekommen haben sollen ein  anderes Produkt bekommen, alle anderen das original gewählte Produkt.
Ich kann allen Kunden das gleiche Produkt zuordnen - kein Problem.
/-
für jede Kunden_id
insert into Bestellung
(kunden_id, produkt_id, bestell_datum) values('$kunden_id','$produkt_id','$datum')
-/
Ich kann den besonderen Kunden das neu gewählte Produkt zuordnen, auch kein Problem.
/-
$i=0;
foreach($hatschon as $neuid)
{
insert into Bestellung
(kunden_id, produkt_id, bestell_datum) values('$kunden_id[$i]','$produkt_neu_id[$i]','$datum')
$i++;
}
Nebenfrage: braucht es hier überhaupt das $i?
-/
Aber wie kann ich das Splitten?
Eine Möglichkeit wäre es eventl. zuerst allen Kunden das original gewählte Produkt zuzuordnen und dann die einzelnen Kundendaten upzudaten!? Aber das scheint mir zu fehleranfällig, oder?
Gibt es da eine sinnvollere Lösung?

Danke für Tips und Tricks ;-)

Kermit

  1. yo,

    habe eine Tabelle Bestellung mit
    bestell_id, kunden_id, produkt_id, bestell_datum

    kommt mir ein wenig problematisch vor. kann man den nicht in einer bestellung mehrere produkte bestellen, bzw. das gleiche produkt mehrmals bestellen ? aber das alles hängt von deiner fachlichkeit ab, die ich nicht kenne.

    Wenn eine neue Bestellung aufgegeben wird geht das Produkt an alle Kunden!

    das muss ein bestllsystem sein, dass sehr speziell ist. wäre von vorteil, wenn wir ein wenig mehr background über so besondere fällen bekommen.

    für jede Kunden_id
    insert into Bestellung
    (kunden_id, produkt_id, bestell_datum) values('$kunden_id','$produkt_id','$datum')

    das geht auch mit einer einzigen SQL anweisung, du musst nicht für jeden einzelnen kunden, der das produkt noch nicht bekommen hat ein insert machen.

    Aber wie kann ich das Splitten?

    wenn du den kunden, die das produkt schon vorher hatten, ein anderes produkt zuordnen willst, dann musst du zuerst eine abfrage machen, die dir diese speziellen kunden als ergebnisliste zurück gibt. über die iterierst du in einer schleife, wählst dabei für jeden ein anderes produkt aus. wenn die schleife durch ist, gibtst du den anderen kunden, die das produkt noch nicht haben mit einer einzigen anweisung das ausgewählte produkt.

    Ilja

    1. Hallo,

      habe eine Tabelle Bestellung mit
      bestell_id, kunden_id, produkt_id, bestell_datum

      kommt mir ein wenig problematisch vor. kann man den nicht in einer bestellung mehrere produkte bestellen, bzw. das gleiche produkt mehrmals bestellen ? aber das alles hängt von deiner fachlichkeit ab, die ich nicht kenne.

      Handelt sich um ein Abo System. D.h. die Bestellung wird vom Admin initiert und bei jeder Bestellung kann nur ein Produkt ausgeliefert werden. Da es aber passieren könnte, daß ein langjähriger Abo-Kunde schonmal ein gewähltes Produkt bekommen hat (auch der Admin ist nur ein Mensch ;-) ), muß ich für diesen Fall eine Alternative anbieten.

      für jede Kunden_id
      insert into Bestellung
      (kunden_id, produkt_id, bestell_datum) values('$kunden_id','$produkt_id','$datum')

      das geht auch mit einer einzigen SQL anweisung, du musst nicht für jeden

      einzelnen kunden, der das produkt noch nicht bekommen hat ein insert machen.

      Wie würde so was aussehen? Wäre natürlich viel einfacher.
      insert into Bestellung (kunden_id, produkt_id, bestell_datum) values ('$kunden_id[1]','$produkt_id','$datum'),('$kunden_id[2]','$produkt_id','$datum'), (etc)???
      NEBENFRAGE: Datum: wenn ich das Datum an dem die Anweisung ausgeführt wurde ein speichern will wie lautet das bei MySql? CURRENT_DATE nimmt er ja nicht auch NOW und DATE werden nicht akzeptiert. Habe das so gelöst, daß ich $datum über PHP das heutige Datum zuweise -aber da gibt es doch sicherlich auch eine vernünftigere Lösung.

      Aber wie kann ich das Splitten?

      wenn du den kunden, die das produkt schon vorher hatten, ein anderes produkt zuordnen willst, dann musst du zuerst eine abfrage machen, die dir diese speziellen kunden als ergebnisliste zurück gibt. über die iterierst du in einer schleife, wählst dabei für jeden ein anderes produkt aus. wenn die schleife durch ist, gibtst du den anderen kunden, die das produkt noch nicht haben mit einer einzigen anweisung das ausgewählte produkt.

      ALSO:
      Select kunden_id from KUNDEN WHERE abo=bestellt
      hier habe ich alle Kunden die für das ABO in Frage kommen

      Select kunden_id from Bestellung where produkt_id=gewähltes_produkt_id
      hier habe ich alle Kunden die das Produkt schon mal bekommen haben.

      So weit bin ich ja gekommen, nur mir ist immer noch nicht klar, wie ich nun alle Kunden die das Produkt noch nicht bekommen haben aus der Menge der gesamt Kunden raus bekomme??

      1. yo,

        Handelt sich um ein Abo System. D.h. die Bestellung wird vom Admin initiert und bei jeder Bestellung kann nur ein Produkt ausgeliefert werden.

        also mit abos kenne ich mich sehr gut aus und ich merke, wir reden von anderen begrifflichkeiten. eine bestelllung ist ein vertrag und dieser muss schon vorher zustande gekommen sein, damit ein admin tätig werden kann. was du sicherlich meinst sind die jeweiligen zyklen eines bereits vorher bestellten abos. oder täusche ich mich da ?

        Wie würde so was aussehen? Wäre natürlich viel einfacher.
        insert into Bestellung (kunden_id, produkt_id, bestell_datum) values ('$kunden_id[1]','$produkt_id','$datum'),('$kunden_id[2]','$produkt_id','$datum'), (etc)???

        werde ich weiter unten anführen, wie ein INSERT aus einem SELECT heraus funktioniert.

        NEBENFRAGE: Datum: wenn ich das Datum an dem die Anweisung ausgeführt wurde ein speichern will wie lautet das bei MySql? CURRENT_DATE nimmt er ja nicht auch NOW und DATE werden nicht akzeptiert. Habe das so gelöst, daß ich $datum über PHP das heutige Datum zuweise -aber da gibt es doch sicherlich auch eine vernünftigere Lösung.

        hmm, die frage habe ich jetzt nicht gehört. deswegen schauchst du ganz schnell auf die webseite von mysql und schauchst in der Doku unter Datumsfunktionen nach.

        Select kunden_id from Bestellung where produkt_id=gewähltes_produkt_id
        hier habe ich alle Kunden die das Produkt schon mal bekommen haben.

        ist doch schon mal die halbe miete, dazu könntest du noch alle produkte anzeigen, die diese kunden bereits bekommen haben, damit bei der händischen auswahl eines neuen produktes der operator einen überblick hat. GROUP_CONCAT wäre ein stichwort für dich.

        So weit bin ich ja gekommen, nur mir ist immer noch nicht klar, wie ich nun alle Kunden die das Produkt noch nicht bekommen haben aus der Menge der gesamt Kunden raus bekomme??

        recht trivial die aufgabe, was du brauchst ist ein OUTER JOIN in verbindung mit einer INSERT anweisung.

        INSERT INTO Bestellung (kunden_id, produkt_id, bestell_datum)
        SELECT kunden_id, gewähltes_produkt_id, und_hier_die_Datumsfunktion
        FROM Bestellung b
        LEFT JOIN produkttabelle p ON p.produkt_id = b.produkt_id
        WHERE p.produkt_id = gewähltes_produkt_id
        AND p.produkt_id IS NULL
        ;

        Ilja