PHP实现单MySQL查询生成多CSV及合并查询、表创建需求
解决方案
没问题,我来帮你一步步搞定这两个需求!
1. 创建MySQL汇率表并插入记录
首先按照你提供的语句创建表,小提醒:table是MySQL的保留字,建议换成更有意义的名字比如currency_exchange_rates,避免潜在的语法冲突。下面是调整后的创建语句(如果坚持用原表名,保留你给的语句即可):
-- 推荐使用更清晰的表名 CREATE TABLE IF NOT EXISTS `currency_exchange_rates` ( `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 KEY `unique_currency_date` (`currency`, `temptime`) ) ENGINE = MyISAM; -- 如果你一定要用原表名 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;
接下来是插入记录的示例,你可以根据实际业务数据调整字段值:
-- 插入测试数据,注意temptime是DATE类型,格式需符合YYYY-MM-DD INSERT INTO `currency_exchange_rates` (currency, rate, date, temptime) VALUES ('USD', 7.25, '2024-05-20 10:30:00', '2024-05-20'), ('EUR', 7.82, '2024-05-20 10:30:00', '2024-05-20'), ('GBP', 8.95, '2024-05-20 10:30:00', '2024-05-20'), ('USD', 7.26, '2024-05-21 09:15:00', '2024-05-21');
2. 合并查询并生成多个CSV文件
原来多查询生成多CSV的方式效率偏低,我们可以一次性查询所有需要的数据,再按指定条件(比如货币类型、日期)分组拆分生成多个CSV,这样能减少数据库交互次数,提升整体性能。
下面是完整的PHP代码示例:
<?php // 数据库配置信息 $host = 'localhost'; $dbname = 'your_database_name'; $username = 'your_db_username'; $password = 'your_db_password'; try { // 初始化PDO数据库连接 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 合并后的查询:一次性获取所有汇率数据 $query = "SELECT id, currency, rate, date, temptime FROM currency_exchange_rates ORDER BY currency, temptime"; $stmt = $pdo->prepare($query); $stmt->execute(); $allData = $stmt->fetchAll(PDO::FETCH_ASSOC); // 按货币类型分组,准备生成每个货币单独的CSV $groupedByCurrency = []; foreach ($allData as $row) { $currency = $row['currency']; if (!isset($groupedByCurrency[$currency])) { $groupedByCurrency[$currency] = []; } $groupedByCurrency[$currency][] = $row; } // 循环生成每个分组的CSV文件 foreach ($groupedByCurrency as $currency => $rows) { $filename = "exchange_rate_{$currency}.csv"; $file = fopen($filename, 'w'); // 写入CSV表头 fputcsv($file, array_keys($rows[0])); // 写入数据行 foreach ($rows as $row) { fputcsv($file, $row); } fclose($file); echo "成功生成CSV文件:{$filename}<br>"; } // 如果你需要按日期分组生成CSV,替换成下面的分组逻辑即可: /* $groupedByDate = []; foreach ($allData as $row) { $date = $row['temptime']; if (!isset($groupedByDate[$date])) { $groupedByDate[$date] = []; } $groupedByDate[$date][] = $row; } */ } catch(PDOException $e) { die("数据库操作失败: " . $e->getMessage()); } ?>
代码关键说明:
- 合并查询:用单条SQL拉取所有数据,避免多次连接查询数据库,提升效率
- 分组逻辑:示例按
currency分组生成CSV,你也可以轻松改成按temptime(日期)分组,只需要替换分组代码块 - CSV生成:用PHP内置的
fputcsv函数,自动处理逗号分隔、引号转义等细节,确保CSV格式标准 - 错误处理:通过PDO异常捕获机制,方便快速排查数据库连接或查询问题
内容的提问来源于stack exchange,提问作者Julius Barra
相关产品推荐
相关产品推荐

