更新#1 我有一个php文件,其中有多个查询可以创建多个csv文件。 我想结合查询。
我的mysql table
有5列:ID,货币,汇率,日期,临时值
创建表table
并插入一些记录
CREATE TABLE IF NOT EXISTS `table` ( `id` INT NOT NULL AUTO_INCREMENT , `currency` VARCHAR(254) NOT NULL , `rate` FLOAT NOT NULL , `date` VARCHAR(254) NOT NULL , `temptime` DATE NOT NULL , PRIMARY KEY (`id`), UNIQUE `UNIQUE` (`currency`, `temptime`)) ENGINE = MyISAM;
INSERT INTO `table`
(currency, rate, date, temptime)
VALUES
('USD', '1.232', '1521212400', '2018-03-16'),
('USD', '1.258', '1521126000', '2018-03-15'),
('JPY', '133.82', '1521212400', '2018-03-16'),
('JPY', '131.88', '1521126000', '2018-03-15'),
('EUR', '1.99', '1521212400', '2018-03-16'),
('EUR', '1.85', '1521126000', '2018-03-15'),
('BRL', '1.6654', '1521212400', '2018-03-16'),
('BRL', '1.5498', '1521126000', '2018-03-15'),
('ZAR', '1.99654', '1521212400', '2018-03-16'),
('ZAR', '2.0198', '1521126000', '2018-03-15'),
('RUB', '19.9654', '1521212400', '2018-03-16'),
('RUB', '20.0198', '1521126000', '2018-03-15');
这是我想要为列"货币"组合的2个查询。美元和欧元:
$result = mysql_query("SELECT temptime, rate FROM `table` WHERE currency='USD' ORDER BY date asc");
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$fp = fopen('csv/USD.csv', 'w');
if ($fp && $result)
{
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
}
$result = mysql_query("SELECT temptime, rate FROM `table` WHERE currency='EUR' ORDER BY date asc");
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$fp = fopen('csv/EUR.csv', 'w');
if ($fp && $result)
{
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
}
谢谢
答案 0 :(得分:1)
您可以使用每行中的货币字段来决定要写入哪个文件,我已经使用了一个文件句柄数组,而不是围绕哪个文件有任何条件,您只需使用该货币作为索引即可文件句柄......
// Create an array of files, each associated with currency
$fp = array( 'EUR' => fopen('csv/EUR.csv', 'w'),
'USD' => fopen('csv/USD.csv', 'w'));
$result = mysql_query("SELECT currency, temptime, rate FROM `table` ORDER BY date asc");
if (!$result) die("Couldn't fetch records");
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
// Write out headers to each file.
foreach ( $fp as $output ) {
fputcsv($output, $headers);
}
while ($row = mysql_fetch_row($result)) {
// Use first field to decide which file to write to.
$currency = array_shift($row);
fputcsv($fp[$currency], $row);
}
// Close all of the files.
foreach ( $fp as $output ) {
fclose($output);
}
由于我没有您的数据库,我无法对此进行测试,但如果您有任何问题,请告知我们。
答案 1 :(得分:0)
还考虑不使用循环并直接从MySQL导出到CSV SELECT ... INTO OUTFILE
(LOAD DATA INFILE
的补充)。
具体来说,在PHP下面单独执行两个动作查询(确保转义引号)。虽然没有结合,但这个过程应该是比多个循环更快的读/写IO过程。另外,您可以在不更改csv导出代码的情况下交换应用层(即使用Python,Java)!
SELECT temptime, rate
INTO OUTFILE '/path/to/csv/USD.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='USD'
ORDER BY `date` asc;
SELECT temptime, rate
INTO OUTFILE '/path/to/csv/EUR.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='EUR'
ORDER BY `date` asc;
对于一个调用,将它们放在MySQL存储过程中:
DELIMITER $$
DROP PROCEDURE IF EXISTS export_csv$$
CREATE PROCEDURE export_csv
BEGIN
-- SELECT ... INTO OUTFILE COMMANDS
END$$
DELIMITER ;
然后在PHP中使用单行(使用mysqli
API)运行它:
$result = mysqli_query($conn, "CALL export_csv")
请注意:标题不会与上述命令一起传递。使用需要类型转换的联合解决调整查询。并且CSV不会存储类型或unicodes元数据以在此处出现问题。
SELECT 'temptime' as col1, 'rate' as col2
UNION ALL
SELECT CAST(temptime, CHAR(10) as col1,
CAST(ROUND(rate,4) AS CHAR(3)) as col2
INTO OUTFILE '/path/to/csv/USD.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `table`
WHERE currency='USD' ;