0

Apacheの上でphp-scriptを実行しています。ユーザーが特定の URL にアクセスするたびに、csv ファイルが取得されます。

列名は次のように取得されます (Daniel Figueroa に感謝:)

$csv_output .= "\n";
// get the column name from the first DB (ins.data)
mysql_select_db($db, $link) or die("Can not connect to DB1.");
$result = mysql_query("SHOW COLUMNS FROM ".$table." WHERE Field NOT IN
('ID','Key','Text')");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}

// get the column names from the second DB (Cu.data)
mysql_select_db($db2, $link) or die("Can not connect to DB2.");
$result = mysql_query("SHOW COLUMNS FROM ".$table2." ");
 ;
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
    $csv_output .= $row['Field']."; ";
    $i++;
}
}
$csv_output .= "\n";

PHP スクリプトの実際のクエリは次のようになります。

$values = mysql_query(" SELECT ins.data.`Date`,  ins.data.`Number`, 
 ins.data.`Email`, ins.data.`TargetId`, ins.data.`CSW`,
 ins.data.`TSW`, ins.data.`CType`,
 Cu.data.`Cus`, Cu.data.`Co`,Cu.data.`Ci`,
 Cu.data.`SID`, Cu.data.`SType` 
 FROM ins.data
 LEFT JOIN  Cu.data ON (ins.data.TargetId = Cu.data.TargetID)
 ORDER BY ins.data.ID DESC");

「desc」の出力:

mysql> desc ins.data;
+-------------------+------------------+------+-----+---------------------+----------------+
| Field             | Type             | Null | Key | Default             | Extra          |
+-------------------+------------------+------+-----+---------------------+----------------+
| ID                | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| Date              | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| Number            | text             | NO   |     | NULL                |                |
| Text              | text             | NO   |     | NULL                |                |
| Email             | text             | NO   |     | NULL                |                |
| TargetId          | varchar(20)      | NO   |     | NULL                |                |
| CSW               | text             | NO   |     | NULL                |                |
| TSW               | text             | NO   |     | NULL                |                |
| Key               | text             | NO   |     | NULL                |                |
| CType             | text             | NO   |     | NULL                |                |
+-------------------+------------------+------+-----+---------------------+----------------+
10 rows in set (0.00 sec)

mysql> desc Cu.data;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| Title    | decimal(15,0) | NO   |     | NULL    |       |
| Cu       | text          | NO   |     | NULL    |       |
| Co       | text          | NO   |     | NULL    |       |
| Ci       | text          | NO   |     | NULL    |       |
| SID      | text          | NO   |     | NULL    |       |
| TargetID | varchar(20)   | NO   | MUL | NULL    |       |
| SType    | text          | NO   |     | NULL    |       |
| empty1   | int(11)       | NO   |     | NULL    |       |
| empty2   | int(11)       | NO   |     | NULL    |       |
| empty3   | int(11)       | NO   |     | NULL    |       |
| empty4   | int(11)       | NO   |     | NULL    |       |
| empty5   | int(11)       | NO   |     | NULL    |       |
| empty6   | int(11)       | NO   |     | NULL    |       |
| empty7   | int(11)       | NO   |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
12 rows in set (0.00 sec)

更新 3:

これはもはや NATURAL LEFT JOIN の問題ではありません。LEFT JOIN に置き換えられました。

データを csv ファイルに取得するために、フィールド empty1-5 を ins.data に追加しました。フィールド empty1-5 がない場合、最初のデータベース (ins.data) からのデータのみが csv.file にありました。

現在、すべてのフィールドにデータがありますが、csv のフィールド (または Excel の列名) 名の順序が間違っており、不要なフィールド (列) が Title や empty1-5 のように表示されます。

これを修正する方法はありますか?「SHOW COLUMNS」なしでフィールド名をcsvファイルに取得する他の方法はありますか?

csv ファイル値の先頭に「echo」を使用して、必要なものを書き込むことができます。すなわち、「日付; 番号; 電子メール; TargetID、CSW; TSW; CType; Cu; SID; Co; Ci; SType;」しかし、私はPHPの初心者なので、方法がわかりません:(

もう 1 つの問題は、フィールド ID が Excel の最初の列である場合、Excel はそれを処理できず、SHOW COLUMNS 出力から除外する必要があることです。

UPDATE4: DB2 (Cu.data) に空のフィールドを追加し、SQL クエリを並べ替えました。すべての値が正しい順序で表示されるようになりました。

4

2 に答える 2

0

テーブル名に別名を付けてみてください。クエリも読みやすくなります。

SELECT 
    i.`Date`, i.Number, i.Email, i.TID, i.CSW, i.TSW, i.CType, 
    c.Cu, c.Co, c.Ci, c.SID, c.TID, c.SType  
FROM 
    ins.data AS i
  LEFT JOIN 
    Cu.data AS c
      ON i.TID =  c.TID 
ORDER BY 
    i.ID DESC ;
于 2012-08-10T09:19:16.930 に答える
0

編集

まず第一に、テーブルの命名スキーマは奇妙で珍しいです...しかし、私がそれを正しく理解していると仮定すると、このクエリは機能するはずです(そうでない場合は、ドット(ピリオド)なしでテーブルの名前を変更して混乱を減らします:

mysql_query('SELECT ins.data.Date, ins.data.Number, ins.data.Email, ins.data.TID, ins.data.CSW, ins.data.TSW, ins.data.CType, CU.data.SID, cu.data.SType, cu.data.CU, cu.data.CO, cu.data.Ci, FROM ins.data, cu.data ORDER BY ins.data.ID DESC');

mysql_query 関数のリファレンスによると、PHP で mysql_query を使用する場合、データはセミコロンで終了するべきではありません...私はそこにセミコロンを入れたことがないので、問題はありません。私はそれを試したことがないと言ったので、それが問題かどうかはわかりません)。次のようにする必要があります。

$values = mysql_query("SELECT Date, Number, Email, TID, CSW, TSW, CType, SID, SType, Cu, Co, Ci FROM ins.data NATURAL LEFT JOIN Cu.data ORDER BY ID DESC");

また、JOINS を実行するときは、通常、どの列がどのテーブルに属しているかを指定します...標準の mysql の例のように:

<?php
// Make a MySQL Connection
// Construct our join query
$query = "SELECT family.Position, food.Meal ".
 "FROM family LEFT JOIN food ".
    "ON family.Position = food.Position"; 

$result = mysql_query($query) or die(mysql_error());


// Print out the contents of each row into a table 
while($row = mysql_fetch_array($result)){
    echo $row['Position']. " - ". $row['Meal'];
    echo "<br />";
}
?>

私も常に JOIN コマンドを使用しているわけではありません...次のような代替構文を使用できます。

mysql_query('SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a');
于 2012-08-10T05:20:33.360 に答える