0

私はMySQLとPHP(XAMPPを実行し、HeidiSQLも使用)を学んでいますが、情報が現在ある無数のスプレッドシートの代わりに使用しようとしている作業用のライブプロジェクトがあります。

列の 1 つが文字列 (contract_no) であるテーブル (tbl_searches) に 1,000 行以上をインポートしたいと考えています。tbl_searches が必要とするスプレッドシートにない情報には、search_id (PK で AUTO_INCREMENT である) と contract_id が含まれます。したがって、私が実際に見逃している唯一のフィールドはcontract_idです。contract_id と contract_no を含むテーブル (tbl_contracts) があります。したがって、そのテーブルを参照してcontract_noのcontract_idを取得するために、文字列contract_noを使用してインポートを行うことができると思いますが、方法がわかりません。

[編集] tbl_contracts を Excel にエクスポートし、Excel の VLOOKUP 関数を使用した後、HeidiSQL を使用して情報を正常にインポートしたことを忘れていましたが、何らかの形で誤ったデータが生成されました。

4

3 に答える 3

2

あなたはこのようにすることができます

LOAD DATA LOCAL INFILE '/path/to/your/file.csv' 
INTO TABLE table1 
  FIELDS TERMINATED BY ',' 
         OPTIONALLY ENCLOSED BY '"' 
  LINES TERMINATED BY '\n' -- or '\r\n' 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
    ...
于 2013-08-10T08:41:44.840 に答える
0

このようなことを試してください: (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);
?>
于 2013-08-10T08:51:17.557 に答える
0

皆様のご意見をお寄せいただきありがとうございます。peterm のガイダンスは、データをインポートするのに役立ちました。Rahul さん、私はこのタスクに PHP を使用したのではなく、HeidiSQL を使用してテーブルにデータを取り込もうとしていたことを言及すべきでした。user4035 が詳細を尋ねたので、それもここにあります。

データベースに 3 つのテーブルがあります。

  1. tbl_status には、status_ID (AUTO_INCREMENT) と status_name の 2 つのフィールドがあります。
  2. tbl_contracts には、contract_ID (AUTO_INCREMENT) と contract_no (文字列) の 2 つの列があります。
  3. 最後のテーブル (tbl_searches) は、ユーザーのアクションが記録されるアクティブな (?) テーブルになります。

これらのテーブルの最初の 2 つには、簡単にデータが取り込まれました。tbl_status には、契約のステータスを説明する 11 行があり、これらは Excel スプレッドシートに入力され、HeidiSQL を介して CSV 経由でインポートされました。

2 番目のテーブルでは、インポートする「契約」が 1,000 件以上あったため、Excel の最初の列を空白のままにし、契約の文字列を含む 2 番目の列を同じ方法でインポートしました。

3 番目のテーブルには、search_id (AUTO_INCREMENT)、contract_id、contract_no、status_id、notes、initials、search_date の 7 つのフィールドがあります (これは今まで忘れていました)。

検索情報を含むスプレッドシートを tbl_searches に挿入したかったのです。これには contract_no がありますが、contract_id はありません。行を挿入し、クエリで tbl_contracts から contract_id を取得する必要がありました。エラーや予期しない結果が発生することなく、正しく処理するのに少し時間がかかりました。(次のクエリでは、search_date が必要ありません。)

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 '\r\n'
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. */

ここで、@blah がユーザー変数であることを学びました。次のクエリを実行すると、変数がどのように定義されているかがわかります。CSV ファイルから 1,000 行以上を挿入していたので、挿入された最後の行の答えが得られました。

SELECT @contract_no

私が最終的にクエリを書いた方法について提案された改善点があれば、教えてください。

-マット

于 2013-08-11T13:01:49.790 に答える