MySQLに評価の集計をしている場合CSVでの更新

このQ&Aのポイント
  • MySQLで評価の集計を行う際、CSVでの更新方法について考えています。テーブルの構造や更新方法について解説します。
  • データベースで評価の集計を行う際、PHPを使用してCSVファイルからデータをインポートする方法について調査しています。
  • データベースの評価集計とデータの更新を組み合わせるための適切な方法について考えています。テーブルの作成やデータの取り扱い方法について検討します。
回答を見る
  • ベストアンサー

MySQLに評価の集計をしている場合CSVでの更新

例としまして、下記のようなテーブルがあるとします。 ┼─┼───┼──┼────┼ │ID│NAME│KAZU│HYOUKA│ ┼─┼───┼──┼────┼ │0 │アイドル│30 │1500   │ ┼─┼───┼──┼────┼ │1 │アクター│15 │2000   │ ┼─┼───┼──┼────┼ │2 │オペラ│5  │4000  │ ┼─┼───┼──┼────┼ カラム:ID・NAME・KAZU のデータは、更新の際、CSVでインポートを考えています。 カラム・HYOUKA は、外部からクリックで評価してもらった数を集計しようと考えています。 データのみのDB、評価の集計のみのDBはできるのですが、 これを両方兼ねたデータベースを作ってPHPで表示し、更新があったらCSVでインポートした場合、 「HYOUKA」の数をそのままでということは可能なのでしょうか。 こういった場合、テーブルを別に作って…など、上記とは違った方法を取るのが正しいのでしょうか。

  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

どちらもあるでしょう。 プログラムでCSVを読みながら、行単位にテーブルを更新するSQLを発行することで更新することも出来ますし、CSVをワークテーブルに一気に読み込んで、それを元に本番用テーブルを更新するSQLを実行することも可能です。 本番用テーブルの洗い替えの行数が多い場合は後者の方が効率的かもしれません。

rabbit-kimura
質問者

お礼

どちらも可能なんですね!! >>本番用テーブルの洗い替えの行数が多い場合は後者の方が カラム数もレコード数もたぶんかなり多くなる予定なのでこちらで調べてみます!! ありがとうございました!!

関連するQ&A

  • csvファイルを使ってMySQLのテーブルを更新し

    約2万件ある15個のカラムで構成されるMySQLのテーブルがあります。 このテーブルをcsvファイルを使って更新しようと考えています。 csvファイルにはレコードIDとあるカラムの変更する値の2つのセルで 構成されています。 行数は毎回異なりますが、だいたい300行前後です。 csvファイルの具体的イメージはこんな感じです。 id order ============ 2,  200 4,  10 7,  460 11,  35 MySQLのテーブルの方にも「id」と「order」というカラムが存在します。 java や PHP を使ってやる方法はわかるんですが、プログラムを作成しないで SQLだけで行いたいと考えています。 LOAD DATA LOCAL INFILE などがあることがわかったのですが、レコードを REPLACE  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

  • MySQLで、指定の複数カラムのみコピーする方法

    同じ構造の、  A_table と B_table があります。 それぞれに  id date name address mail comment という、6つのカラムがあります。 変更があった際に、 A_table にcsvで全データをインポートし、  B_table に変更のあったカラム( date name address mail )の列だけをコピーしたいと思っています。 ( id )は A_table と B_table 共通にし、変更しないことを前提としています。 ( comment )は外部から編集できるため、csvデータが最新の情報とは限りませんので、 csvデータでの変更は考えておりません。 レコード数としては、多い方だと思います。 上記の作業をしようと思っているのですが、 >> B_table に変更のあったカラム( date name address mail )の列だけをコピー する方法をご存じの方がいらっしゃいましたら、何卒、ご教授お願い致します。 また、 変更したいカラムだけ、csvデータとidを共通にすればインポート可能かな…と探してはみたのですが無いようで、こちらはできないと考えても大丈夫なのでしょうか。 (phpmyadminを利用しておりますが、カラム名を指定してインポートはできるのですが、  指定しないカラムは空白になって上書きされてしまいます。) ついでで申し訳ないですが、宜しければアドバイスをいただければと思います。

  • MYSQLでCSVインポートが一行目しかされません

    phpMyAdminで空のテーブルにCSVファイルをインポートをしているのですが、なぜか一行目だけしかインポートされずに困っています。 フィールド数は合っているのですが、なにか思い当たる原因があれば教えていただけますでしょうか。 こちらはチェックしていて、テキストエディタで開いてカンマの位置や数も合っているはずなのですが。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1132222936 ちなみにデータは、 フィールド名 a(varchar(20)),b(float(6,4)) に対して 値 1,1.34 2,1.21 3,1.25 のような単純なデータです。 すでにテーブルとフィールドは作ってあり、CSVデータは 1,1.34 2,1.21 3,1.25 というデータのみです。 何度やっても、「1,1.34」の一行目だけしかインポートされません。

    • ベストアンサー
    • MySQL
  • ファイルからのデータ更新について

    表題の件について質問させていただきます。 mysqlでカンマつきのCSVファイルからデータをテーブルにインポートする際、 load data infile 'ファイルディレクトリ情報' update table テーブル名 fields terminated by ','; でインポート可能かと思います。 では、このファイルをインポートしたあとに、CSVのデータを変更して同じコマンドを使用すると、レコードが追加され、「更新」にはなりません。 ファイルからのレコード更新はどのようにすれば宜しいでしょうか? 例として下記のDB定義、インポートファイルを使用しています。 データベース定義 bang(INT) name(VARCHAR(10)) ten (INT) インポートファイル変更前 1,山本,85 2,木村,58 3,山崎,95 インポートファイル変更後 1,山本,85 2,木村,58 3,今田,95      ←name変更 何卒よろしくお願いします。

  • PHP+MySQLでクロス集計は出来ますか?

    こんばんは。 いつもお世話になっております。 検索して調べてみたのですが、見つからなかったので 質問させていただきました。 どうか、ご指導よろしくお願いいたします。 syouhin_tb(商品テーブル) syouhin_id syouhin_name siiresaki_id uriage_tb(売り上げテーブル) uriage_id nen tuki syouhin_id uriage_kingaku tanka uriage_kazu という、二つのテーブルから ---------------------------------------- nen ┃tuki┃syouhin_name┃uriage_kingaku┃tanka┃uriage_kazu ------------------------------------------ 2005┃ 01 ┃ コサージュA┃    1000   ┃ 500 ┃2 2005┃ 02 ┃ コサージュA┃    1500   ┃ 500 ┃3 <略> というところまでは出来たのですが、これを年ごとに 月別で表に出力する事は可能なのでしょうか・・・? 【希望出力画面】 -------------------------------------------------- 2005年売り上げ表 syouhin_name┃  1月    ┃  2月    ┃・・ コサージュA ┃1000┃500┃2┃1500┃500┃3┃・・ コサージュB ┃3600┃400┃9┃2000┃400┃5┃・・ よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MYSQLを用いた集計について

    MySQLを用いた、クロス集計(?)のデータについてどこを探しても見つからなかったので、投稿します。 DBAとDBB、DBCをLEFT JOINを行って、DBCの複数条件の全てのに適合する、DBBの件数をAのID単位で取得したいと思っています。 <テーブル構成> DB:A ---- id PK B_id FK flag ---- DB:B ---- id PK C_id FK flag ---- DB:B ---- id PK flag ---- そこで色々試行錯誤してみたのですが、良い方法が見つからず、現在は確認を兼ねて、以下の様な形で抽出するリストを構築する所 までは行いました。 --- SELECT *,count(DB_B.id) FROM (DB_A LEFT JOIN DB_B on DB_A.B_id = DB_B.id) JOIN DB_C on DB_B.C_id = DB_C.id WHERE DB_A.flag = 100 AND (DB_C.flag = 1 OR DB_C.flag = 2 OR DB_C.flag = 3) GROUP BY DB_B.id HAVING count(DB_C.id) = 3 --- ここで抽出されるリストをDB_Aのid別に件数を取得するにはどうすればよろしいでしょうか? もちろん、上のコードでは無理だろうと予測はついているのですが、ここから先に進めず…。 ちなみに、環境は以下のとおりです。 MySQL:4.0.27 PHP:4.4.4 ※ちなみに、同じような形式でDB_Dの複合条件、DB_Eの複合条件を掛け合わせていく形もあり得るため、それに準じた方法・知恵をご教授いただけると幸いです。 よろしくお願致します。

  • MySQLでの集計

    いつもお世話になっております。MySQLを利用しておりまして質問です。 同じ構成のテーブルが5つあり、選択されたテーブルを集計するSQLを作成しています。 カラムを簡単に構成を書くと ID、名前、ステータス1、ステータス2 のような形です。 テーブル1、2、3が選択された場合 テーブル1と2でIDの重複のない一覧を作成し、IDが被っていた場合はステータスをそれぞれ大きいほうを保持するようにします。 そして次にテーブル1、2を合わせたテーブルとテーブル3で同じように集計をしたいのですが、ここがうまく出来ません。 実際の環境ではなく簡素化したものなのでおかしな点があるかもしれませんがこのようになっています。 SELECT TTT1.id,TTT1.名前,TTT1.st1,TTT1.st2 FROM(     SELECT id,名前,ステータス1 as st1,ステータス2 as st2     FROM(        SELECT *        FROM テーブル1 T1        WHERE T1.id NOT IN(SELECT T2.id FROM テーブル2 T2)        UNION All        SELECT *        FROM テーブル2 T2        WHERE T2.id NOT IN(SELECT T1.id FROM テーブル T1)     ) as TT1     UNION     SELECT id,名前,st1,st2     FROM(         SELECT T1.id,T1.名前,         (CASE T1.ステータス1 or T2.ステータス1 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st1,         (CASE T1.ステータス2 or T2.ステータス2 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st2,         FROM テーブル1 T1,テーブル2 T2         WHERE T1.id = T2.id AND NOT(T1.st1 IS null AND T1.st2 IS null AND T2.st1 IS null AND T2.st2 IS null) ) as TT2 )as TTT1 /* UNION ALL SELECT id,名前,st1,st2 FROM (TTT1とテーブル3を比較したもの)as TTT2 */ /**/で囲ったところでTTT1が呼び出せれば、テーブル1のところをTTT1にし、テーブル2をテーブル3にすれば出来ると思うのですが、そういうことは無理なのでしょうか? また集計するテーブルの数が不特定なので一つずつ集計をする形を取りましたが、 もっとこういう風にやればいいと言う方法はございますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MYSQLからCSVへの書き込み方法

    MYSQLからCSVへの書き込み方法で質問があります。 下記のコードを記載しましたが DBのデータ件数分の改行しか出力されませんでした。 ブラウザ上でecho動作させた際には、 echo "<p>CSVファイルにセットされるデータ:".$string; でしっかりデータが設定されていました 何が悪いですか? ////////////////////////////////////////////////////////////////// // DBからCSVファイル書き込み(全件新規) // $file_name:csvファイル名 ////////////////////////////////////////////////////////////////// function DB_csvSet($file_name, $dbhost=DBHOST, $dbuser=DBUSER, $dbpass=DBPASS, $dbname=DBNAME) { print "DB_csvSet start"; // MySQL 接続 if (!($cn = mysql_connect($dbhost, $dbuser, $dbpass))) { die("DB_csvSet Error: mysql_connect"); } //MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis"); // MySQL DB 選択 if (!(mysql_select_db($dbname))) { die("DB_csvSet Error: mysql_select_db"); } // MySQL 問い合わせ $sql = sprintf("select * from %s", TABLE_NAME); if (!($rs = mysql_query($sql))) { die("DB_csvSet Error: mysql_query"); } // ファイルを新規モードで開く $file = fopen($file_name, "w") or die("OPENエラー $file_name"); // ファイルをロックする flock($file, LOCK_EX); // MySQL レコード参照 while ($item = mysql_fetch_array($rs)) { printf("id=%s ", $item[ITEM_ID]); printf("name=%s ", $item[ITEM_NAME]); printf("point=%s<BR> ", $item[ITEM_POINT]); // 3つの変数から配列を作成する $array = compact($item[ITEM_ID], $item[ITEM_NAME], $item[ITEM_POINT]); // $array = compact("id","name","point"); // 配列のデータをカンマで区切って結合する $string = implode(",", $array); // 結合された文字列を表示する echo "<p>CSVファイルにセットされるデータ:".$string; // データを書き込む fputs($file, $string."\n"); } // ロックを解除する flock($file, LOCK_UN); // ファイルを閉じる fclose($file); // MySQL 切断 mysql_close($cn); // 正常終了 print "正常終了"; }

    • 締切済み
    • PHP
  • MySQLのLOAD文を使ってCSVファイルをデータベースにインポートしたい

    MySQLのLOAD文を使ってCSVファイルの内容をデータベースにインポートしたいと思っています。 そこで、下記のような内容のCSVファイルを作成しました ファイル名:word_list1.csv ↓ファイルの内容↓ 1,apple 2,egg 3,music 4,movie 5,baseball 作成した word_list1.csv の保存場所は C:/hole_problem/word_list1.csv です また、word_list1.csv の内容をインポートするデータベース側のテーブルは下記のコマンドにより定義されています CREATE TABLE word_list( id INT AUTO_INCREMENT, name VARCHAR(50) NOT NULL, CONSTRAINT id_pri PRIMARY KEY (id) ) ENGINE=InnoDB; CSVファイル word_list1.csv とデータベース側のテーブル word_list の準備が整ったところで下記のコマンドを実行しました LOAD DATA LOCAL INFILE "C:/hole_problem/word_list1.csv" INTO TABLE word_list FIELDS TERMINATED BY ','; コマンドはエラーなどなく正常に実行されましたが、実行後にデータベースを参照すると下記のようになっています id name 2 egg 3 music 4 movie 5 baseball 35 apple ここで質問なのですが、なぜ、CSVファイルでの順番とインポート後のデータベースでの順番が異なってきてしまうのでしょうか? 教えて頂けると助かります。 また、どのようにすれば順番が変わることなくCSVファイルの内容をデータベースにインポートできるのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQL この場合どう書けばよいでしょうか?

    以下のようなデータがあります。 このデータから最後の「結果」のような形でデータを取り出したい場合、どのようにすればよいでしょうか? cat1とcat2を分けない形はgroup_concatを使ってできたのですが、カテゴリーごとに分けて取得したいです。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+

    • ベストアンサー
    • MySQL