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 クエリを並べ替えました。すべての値が正しい順序で表示されるようになりました。