/ / Importuj CSV, wyciągając pole jednej kolumny z istniejącej tabeli - mysql, sql

Importuj CSV Ciągnąc jedno pole kolumny z istniejącej tabeli - mysql, sql

Uczę się MySQL i PHP (z XAMPP itakże korzystający z HeidiSQL), ale mam projekt do pracy, który próbuję wykorzystać zamiast arkuszy kalkulacyjnych gazillion, w których obecnie znajdują się informacje.

Chcę zaimportować ponad 1000 wierszy do tabeli(tbl_searches) gdzie jedna z kolumn jest łańcuchem (nr_kontraktu). Informacje nie zawarte w arkuszu kalkulacyjnym wymagane przez tbl_searches obejmują search_id (PK i jest AUTO_INCREMENT) oraz kontrakt_id. Tak więc jedyne pole, którego tak naprawdę mi brakuje, to id_kontraktu. Mam tabelę (tbl_contracts), która zawiera identyfikator umowy i nr umowy. Myślę więc, że mogę zaimportować za pomocą ciągu umowy nr_o, aby odwołać się do tej tabeli, aby pobrać identyfikator_kontraktu dla nr_kontraktu, ale nie wiem jak.

[EDYCJA] Zapomniałem wspomnieć, że udało mi sięzaimportowałem informacje za pomocą HeidiSQL po tym, jak wyeksportowałem tbl_contracts do Excela, a następnie użyłem funkcji Excel WYSZUKAJ.PIONOWO, ale to w jakiś sposób przyniosło nieprawidłowe dane.

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz to zrobić w ten sposób

LOAD DATA LOCAL INFILE "/path/to/your/file.csv"
INTO TABLE table1
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY """
LINES TERMINATED BY "n" -- or "rn" if the file has been prepared on Windows
(@field1, @contract_no, @field2, @field3,...)
SET column1 = @field1,
contract_id = (SELECT contract_id
FROM tbl_contracts
WHERE contract_no = @contract_no
LIMIT 1),
column2 = @field2,
column3 = @field3
...

0 dla odpowiedzi nr 2

spróbuj czegoś takiego: (Zakładam, że masz dane w tbl_contracts)

<?php
$handle = fopen("data_for_table_searches.csv", "r");

while (($data = fgetcsv($handle,",")) !== FALSE) {  // get CSV data from you file
$contract_id = query("SELECT contract_id FROM tbl_contracts WHERE contract_number = " . $data[<row for contract number>]);   // whatever is the equivalent in heidi SQL, to get contract id
query("INSERT INTO tbl_searches values($contract_id, data[0], data[1], data[2],...)");  // whatever is the equivalent in heidi SQL, insert data, including contract id into tbl_searches
}
fclose($handle);
?>

0 dla odpowiedzi № 3

Dzięki za wkład wszystkich. wskazówki peterma pomogły mi zaimportować dane. Rahul, powinienem wspomnieć, że nie korzystałem z PHP do tego zadania, ale po prostu próbowałem wprowadzić dane do tabel za pomocą HeidiSQL. user4035 poprosił o więcej szczegółów i żeby „ też tu jest.

Mam trzy tabele w bazie danych.

  1. tbl_status ma dwa pola, status_ID (AUTO_INCREMENT) i status_name.
  2. tbl_contracts ma dwie kolumny: identyfikator_kontraktu (AUTO_INCREMENT) i nr_kontraktu (ciąg znaków).
  3. Ostatnia tabela (tbl_searches) będzie aktywną (?) Tabelą, w której będą rejestrowane działania użytkowników.

Pierwsze dwie z tych tabel były łatwezaludniony. tbl_status ma 11 wierszy opisujących status kontraktu, które zostały właśnie wpisane do arkusza kalkulacyjnego Excel i zaimportowane przez CSV przez HeidiSQL.

W przypadku drugiej tabeli miałem ponad 1000 „umów” do zaimportowania, więc zostawiłem pierwszą kolumnę w Excelu pustą, a drugą kolumnę zawierającą ciąg umowy i zaimportowałem je w ten sam sposób.

Trzecia tabela ma siedem pól: id_wyszukiwania (AUTO_INCREMENT), id_kontraktu, nr_kontraktu, nr_data, notatki, inicjały i data_wyszukiwania (do tej pory o tym zapomniałem).

Chciałem wstawić arkusz kalkulacyjny, który miałwyszukaj informacje na ten temat w tbl_searches. Ma kontrakt_no, ale nie kontrakt_id. Musiałem wstawić wiersze i poprosić, aby zapytanie pobierało identyfikator umowy z tbl_contracts. Zajęło mi trochę czasu, aby zrobić to dobrze bez błędów i nieoczekiwanych rezultatów. (Poniższe zapytanie pomija potrzebę szukania_daty).

LOAD DATA LOCAL INFILE "\\PATH\PATH\PATH\PATH\FILENAME.csv"
INTO TABLE `hoa_work`.`tbl_searches`
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """ ESCAPED BY """ LINES TERMINATED BY "rn"
IGNORE 1 LINES --because the first row of the CSV has column headers
(@search_id, @contract_id, @contract_no, @status_id, @notes, @initials)
SET
search_id = NULL, --is an AUTO_INCREMENT field
contract_id = (SELECT contract_id
FROM tbl_contracts
WHERE contract_no = @contract_no
LIMIT 1),
contract_no = @contract_no,
status_id = @status_id,
notes = @notes,
initials = @initials;
/* Affected rows: 1,011  Found rows: 0  Warnings: 0  Duration for 1 query: 0.406 sec. */

Dowiedziałem się tutaj, że @blah są zmiennymi użytkownika. Jeśli uruchomię następujące zapytanie, powie mi, jak zdefiniowana jest zmienna. Ponieważ wstawiałem ponad 1000 wierszy z pliku CSV, dał mi odpowiedź na ostatni wiersz, który wstawił.

SELECT @contract_no

Jeśli masz jakieś sugerowane ulepszenia w sposobie, w jaki ostatecznie napisałem zapytanie, proszę powiedz mi.

-Matt