tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
422
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Ahiru Ahiru ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    9
    Hallo - ich habe folgendes Problem:

    Ich möchte gerne neue Markt-Daten in eine Tabelle schreiben, aber diese nicht einfach nur neu einfügen, sondern dies ist an Bedingungen geknüpft.

    Hier mal zur Verdeutlichung einige Beispieldaten:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    
    --
    -- Tabellenstruktur für die  `marktdaten`-Tabellen
    --
     
    CREATE TABLE `old_marketdata` (
      `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
      `orderid` bigint(20) NOT NULL,
      `typeID` bigint(20) NOT NULL,
      `system_id` bigint(20) NOT NULL,
      `created_at` datetime NOT NULL,
      `updated_at` datetime NOT NULL,
      `issued_at` datetime NOT NULL,
      `available_volume` int(30) NOT NULL,
      `price` decimal(10,2) NOT NULL,
      PRIMARY KEY (`orderid`),
      KEY `typeID` (`typeID`),
      KEY `system_id` (`system_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
     
    INSERT INTO `old_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
    (1, 1759455689, 3888, 30003530, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-01 20:01:45', 1, '550499.00'),
    (1, 1759734230, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 18:30:32', 7, '669997.94'),
    (1, 1751274344, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 18:08:07', 7, '669997.95'),
    (0, 1761688087, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 17:51:53', 15, '669997.97'),
    (1, 1761602515, 1236, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 16:42:56', 4, '669997.98');
     
    CREATE TABLE `new_marketdata` (
      `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
      `orderid` bigint(20) NOT NULL,
      `typeID` bigint(20) NOT NULL,
      `system_id` bigint(20) NOT NULL,
      `created_at` datetime NOT NULL,
      `updated_at` datetime NOT NULL,
      `issued_at` datetime NOT NULL,
      `available_volume` int(30) NOT NULL,
      `price` decimal(10,2) NOT NULL,
      PRIMARY KEY (`orderid`),
      KEY `typeID` (`typeID`),
      KEY `system_id` (`system_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
     
    INSERT INTO `new_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
    (1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
    (1, 1759734230, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 6, '669997.74'),
    (1, 1751274344, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
    (1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
    (1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91');
     
     
    --
    -- Resultat (soll eigentlich wieder in old_maketdata stehen und dort eingetragen werden - hier jetzt mal per Hand in eine Tabelle geschrieben:
    --
     
    CREATE TABLE `result_marketdata` (
      `Aktiv` tinyint(1) NOT NULL DEFAULT '1',
      `orderid` bigint(20) NOT NULL,
      `typeID` bigint(20) NOT NULL,
      `system_id` bigint(20) NOT NULL,
      `created_at` datetime NOT NULL,
      `updated_at` datetime NOT NULL,
      `issued_at` datetime NOT NULL,
      `available_volume` int(30) NOT NULL,
      `price` decimal(10,2) NOT NULL,
      PRIMARY KEY (`orderid`),
      KEY `typeID` (`typeID`),
      KEY `system_id` (`system_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
     
    INSERT INTO `result_marketdata` (`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`) VALUES
    (0, 1759455689, 3888, 30003530, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-01 20:01:45', 1, '550499.00'),
    (1, 1759734230, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 7, '669997.74'),
    (1, 1751274344, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
    (0, 1761688087, 3888, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 17:51:53', 15, '669997.97'),
    (1, 1761602515, 1236, 30002187, '2010-10-03 06:10:01', '2010-10-03 06:10:01', '2010-10-03 16:42:56', 4, '669997.98'),
    (1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
    (1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
    (1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91');
    Also was passiert ist folgendes:

    Ich habe die alten Marktdaten in der Tabelle old_marketdata. Nun kommen die neuen Daten (alle mit ein und derselben typeID, system_id und gleicher create_at und updated_at Zeit)
    Nun soll er:
    1. Die alten Daten (where alt.typeID=neu.typeID and alt.system_id=neu.systemID) , die in der neuen Tabelle nicht vorkommen werden auf Aktiv=0 gesetzt.
    2. Die Daten, die in der neuen Tabelle vorkommen, aber in der alten nicht werden neu eingetragen.
    3. Die Daten, die in beiden Tabellen vorkommen (alt.orderid=neu.orderid) werden neu gesetzt, allerdings behalten sie den alten "created_at"-Wert

    Kann ich das mit reinem SQL machen? - Oder würdet ihr das über PHP lösen?
    Die Daten in der new_marketdata kommen aus einer per PHP eingelesenen TXT-Datei - da ich aber nicht wusste, wie ich sonst Punkt 1 hätte lösen können dachte ich es sei vielleicht einfacher, die Daten erst einmal in eine Hilfstabelle zu schreiben. Nun komme ich aber nicht so recht weiter.

    Vielen Dank schonmal!
    Geändert von Ahiru (07.10.10 um 14:24 Uhr)
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ich wollte dein Script mal in meine Test-DB einspielen. Das ist voller Fehler.
    - Die Tabellen heissen anderst als nachher im INSERT-Statement.
    - Die INSERT-Statement sind mehrfach frü dieselben Tabellen
    - Vor dem PRIMAR KEY fehlen überall ein Komma

    und ich habe immer noch Syntax-Fehlern bei dein INSERTs.

    Ich gebs auf diese Daten einzuspielen. Hab grad keine Lust alles duchzugehen bis es funktioniert.

    Grundsätzlich:
    Mach dich mal über TRIGGER schlas. mit denen kannst du bein Einfügen in eine Tabelle noch etwas durchführen. Ob ein UPDATE auf eine andere Tabelle geht weiss ich gerade nicht auswendig
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Ahiru Ahiru ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    9
    Entschuldige - hatte beim Einstellen hier noch die Tabellennamen geändert, damit sie aussagekräftiger werden, und einige Tabellenspalten die für die Funktion nicht wichtig sind gelöscht, damit es übersichtlicher wird - .... hätte es nochmal testen sollen - sorry nochmal!

    Habe es jetzt korrigiert und getestet - sollte nun laufen.

    Habe auch schon über den Trigger gelesen (habe 3 Bücher über SQL hier und versuche zusammen mit Google soweit herauszufinden was ich brauche) - aber so ganz ist mir nicht klar, wie ich den hierbei einsetzen soll - bin mir wie gesagt nicht mal sicher, ob es sinnvoll war die Daten zuvor in die Hilfstabelle new_marketdata zu schreiben? - Oder besser direkt Zeile für Zeile beim Einlesen der txt-Datei mit PHP verarbeiten? - Nur habe ich da keine Idee, wie ich dann prüfen kann, ob eine der alten Daten nicht in den neuen vorhanden und damit inaktiv ist?
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ich glaube du gehst das ganze viel zu kompliziert an.

    Also, du hast eine Tabelle mit Daten.
    Dann kommen Daten aus einem Textfile.
    1) Alle Daten die nicht mehr kommen, sollen auf aktiv=0 gesetzt werden.
    2) Alle Daten die Vorhanden sind, sollen vorhanden bleiben mit demselben created_at
    3) Alle Daten die neu sind, werden neu eingetragen.

    Meine kleine Gegenfrage.
    Was machst du mit der alt und der neu Tabelle. Sind das im Endeffekt wirklich 2 getrennte Tabellen die du später auch getrennt verwendest? Wenns am Ende wieder nur eine Tabelle ist, schlage ich dir den folgenden Losungsansatz vor.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    --Alle bestehenden Marktdaten auf Inaktiv setzen
    UPDATE marketdata
    SET Aktiv = 0;
     
    --Die neuen Daten mittels INSERT....ON DUPLICATE Einfügen oder wenn bereits vorhanden, auf Aktiv=1 setzen
    INSERT INTO marketdata(`Aktiv`, `orderid`, `typeID`, `system_id`, `created_at`, `updated_at`, `issued_at`, `available_volume`, `price`)
    VALUES 
    (1, 1759967589, 3888, 30003530, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 21:02:58', 16, '580497.00'),
    (1, 1759734230, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 20:31:45', 6, '669997.74'),
    (1, 1751274344, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-03 18:08:07', 7, '669997.95'),
    (1, 1761741978, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-05 07:54:03', 45, '669997.94'),
    (1, 1769977654, 3888, 30002187, '2010-10-05 08:15:43', '2010-10-05 08:15:43', '2010-10-04 16:32:18', 9, '669998.91')
    ON DUPLICATE KEY UPDATE 
        Aktiv = 1;
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    Ahiru Ahiru ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    9
    Ist nur eine Tabelle - die 2. war nur eine Hilfstabelle.
    Mein Problem mit dem "on duplicate key update" war, dass er dann alle Daten überschreibt - auch das "created_at".
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Er überschreibt nur die Felder die du nach UPDATE angibst
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. Oracle: Update einer Tabelle mit Bedingungen aus einem Select
    Von Mr_Tom im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 21.11.07, 21:55
  2. [MySQL] Bedingungen zu Datumsfeldern?
    Von oezer im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 18.12.06, 21:00
  3. Antworten: 4
    Letzter Beitrag: 05.10.05, 15:58
  4. Access sql - mehrere update-Bedingungen
    Von Mankind im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 05.05.05, 19:57
  5. MySQL Bedingungen-Syntax
    Von cardician im Forum PHP
    Antworten: 1
    Letzter Beitrag: 17.08.04, 11:01

Stichworte