MySQL - importierte .csv reinigen und in mehrere Tabellen splitten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL - importierte .csv reinigen und in mehrere Tabellen splitten

    Hallo Leute

    Ich hoffe ihr könnt mir weiterhelfen, habe ein (aus meiner Sicht) sehr komplexes Problem:
    Ich habe eine Datenbank, die 1986 erstellt wurde und immer fleissig gefüllt wurde (Kundendaten). Zur Zeit bestehen in dieser ca. 80.000 Einträge.
    Das Datenbankdesign ist mehr als nur primitiv: Alle Daten befinden sich in nur einer Tabelle.
    Bei jedem Besuch des selben Kunden wurde ein Datensatz mit immer den gleichen persönlichen Daten und den verschiedenen Daten zur Beratung (Datum, Typ...) abgespeichert.

    Die Struktur sieht in etwa so aus:

    NAME | DATUM | TELEFON | <<usw...>> | DATUMB | BERATV | <<usw...>>

    Ich möchte jetzt aber die Datenbank in drei Tabellen aufteilen:
    - Kunde (Mit den persönlichen Daten. Wohnort, PLZ und Vorwahl werden mittels id von der Tabelle Ort aufgerufen)
    - Beratung (Jeder Besuch ein Eintrag mit verknüpfung via id zum Kunden)
    - Ort (Wohnort, PLZ, Vorwahl des Kunden)

    Ich würde danach die Daten mittels join abrufen....

    Weiss vielleicht von euch jemand die Lösung?
    Oder einen Lösungsansatz?

    Hab mal was von Cursor gelesen, aber ich blick da wirklich nicht durch....

    Vielen Dank im Voraus
    Thomas
    [COLOR=darkblue]

    Wäre es nicht adequat, den Usus
    heterogener Termini zu minimieren?

    [/COLOR]

  • #2
    Kein SQL-Problem? Kein Ansatz? Also falsches Forum. und *verschieb* nach BS.

    Wo ist dein Problem? Du gehst die Tabelle zeilenweise durch und teilst die ds in verschiedene Tabellen auf.

    als erstes die Userdaten. Da musst du natürlich entsprechende unique-keys einsetzen.

    dann den beratungs-ds. je nach dem ob neuer ds bei userdaten angelegt wurde, musst du hier die entsprechende ID nutzen.

    die tabelle ort ist absolut überflüssig.

    Fertig!

    Kommentar


    • #3
      Danke für die Antwort (Ich dachte aber an einen SQL-Befehl der mir das in einer Query lösen könnte...).

      Habe aber doch ein Problem:

      Habe mit INSERT ..... SELECT zwei Tabellen gefüllt - Sessions und Clients. Habe auch der Sessions (als Vergleichsfeld) den Namen mitgeschickt. (Bei den Clients habe ich mit GROUP BY die Kunden nur einmal drin, bei den Sessions nicht, da hab ich jeden Datensatz eingefügt.)

      Jetzt will ich mit
      UPDATE sessions t1, clients t2 SET t1.id = t2.id WHERE t1.name = t2.name
      in den Sessions die id mittels name an clients anpassen....

      Die Abfrage scheint zu funktionieren, aber nach ca. 1-2 minuten 100% Prozessorauslastung meldet mir MySQL:

      __________________
      #1062 - Duplicate entry '2702' for key 1

      Warning: mysql_result(): supplied argument is not a valid MySQL result resource in (ausgeblendet)\common.lib.php on line 685
      __________________

      Sicherlich gibts hierfür eine logische Antwort, aber ich komm nicht drauf wo der Fehler ist.... bin eben sql-newbie

      Danke im Voraus (wieder einmal
      [COLOR=darkblue]

      Wäre es nicht adequat, den Usus
      heterogener Termini zu minimieren?

      [/COLOR]

      Kommentar


      • #4
        (Ich dachte aber an einen SQL-Befehl der mir das in einer Query lösen könnte...).
        Nee, den gibts leider nur in PHP

        Könntest aber CLEAN_CSV() im zusammenhang mit PARSE_CSV() benutzen. Also in etwa
        INSERT PARSE_CSV(CLEAN_CSV({deinedatei.csv})) INTO ...


        #1062 - Duplicate entry '2702' for key 1
        Na, wenn du nach der Fehlermeldung mal suchen würdest... Du versuchst die 2702 zum zweiten mal einzutragen. Das geht natürlich nicht, weil du ja richtigerweise den UNIQUE-Key drauf gesetzt hast. Den Fehler musst du natürlich jetzt abfangen und entsprechend weiter behandeln. Das hatte ich dir aber bereits geschrieben.

        Wenns nicht klappt, nimm den anderen Ansatz

        Kommentar


        • #5
          Danke für die rasche Antwort.

          Mein Problem lag ganz wo anders:
          Ich wollte ursprünglich schon das Feld clientid in den Sessions mit den Clients verknüpfen, nicht die id mit der id....

          Hab wohl den Überblick verloren bei der Menge an Spalten und Reihen

          Jetzt klappts (logischerweise) mit der richtigen Query:
          UPDATE t1, t2 SET t1.clientid = t2.id WHERE t2.name = t1.name

          Das hätte mir wirklich früher auffallen müssen...

          Aber man kann doch solche Sachen auch innerhalb MySQL machen, mit Cursor, While, Repeat usw... oder nicht (Wäre der Umweg über php unnötig)? Wäre als procedure zum abspeichern interessant gewesen....

          PS: Ich lese hier im Forum seit einem Jahr, hat mir immer weitergeholfen, denn irgendeiner hatte schon ein Problem das ich auch hatte... Speziell im Bereich PHP konnte ich hier vieles lernen.
          [COLOR=darkblue]

          Wäre es nicht adequat, den Usus
          heterogener Termini zu minimieren?

          [/COLOR]

          Kommentar

          Lädt...
          X