Php 连接csv文件并进行排序,使其看起来像SQL查询的结果
我有一个mysql数据库,我使用连接和where子句在该数据库上运行sql查询,假设查询如下Php 连接csv文件并进行排序,使其看起来像SQL查询的结果,php,mysql,arrays,csv,Php,Mysql,Arrays,Csv,我有一个mysql数据库,我使用连接和where子句在该数据库上运行sql查询,假设查询如下 SELECT a.value1, a.value2, b.value3, c.value4 FROM table1 a LEFT JOIN table2 b ON a.some_value=b.some_value LEFT JOIN table3 c ON a.some_value=c.some_value WHERE a.some_value = 'some
SELECT a.value1,
a.value2,
b.value3,
c.value4
FROM table1 a
LEFT JOIN table2 b ON a.some_value=b.some_value
LEFT JOIN table3 c ON a.some_value=c.some_value
WHERE a.some_value = 'some_text';
我在有450万条记录的数据库上运行了1000次查询,以获得此查询所需的平均时间
但是,如果可能的话,我需要帮助
因为我不知道这是否可能,如果可能,怎么做,以及下一步从哪里开始
这些步骤是:我想导出CSV文件
表1、表2和表3(这是可以的,我知道在csv文件中导出表),然后,在PHP中,我希望加载每个csv文件,并获得与此SQL查询几乎完全相同的结果。
我还想运行这个查询1000次,并获得平均时间。我想这样做是为了在表上运行查询和从csv文件排序之间进行比较。如果你真的不得不忍受这种痛苦,至少这是一个相当简单的查询 差不多
$a = fopen('a.csv', 'r');
$b = fopen('b.csv', 'r');
$c = fopen('c.csv', 'r');
$output = fopen('php://output', 'w');
while (($dataA = fgetcsv($a, 1024, ",")) !== false) {
if ($dataA[0] == 'some_text') {
$bCount = 0;
rewind($b);
while (($dataB = fgetcsv($b, 1024, ",")) !== false) {
if ($dataB[0] == $dataA[3]) {
$bCount = 0;
$cCount = 0;
rewind($c);
while (($dataC = fgetcsv($c, 1024, ",")) !== false) {
if ($dataC[0] == $dataA[4]) {
fputcsv($output, [$dataA[1], $dataA[2], $dataB[1], $dataC[1]]);
++$cCount;
}
}
if ($cCount == 0) {
fputcsv($output, [$dataA[1], $dataA[2], $dataB[1], null]);
}
++$bCount;
}
}
if ($bCount == 0) {
$cCount = 0;
rewind($c);
while (($dataC = fgetcsv($c, 1024, ",")) !== false) {
if ($dataC[0] == $dataA[4]) {
fputcsv($output, [$dataA[1], $dataA[2], null, $dataC[1]]);
++$cCount;
}
}
if ($cCount == 0) {
fputcsv($output, [$dataA[1], $dataA[2], null, null]);
}
}
}
}
会非常接近你想要的
修改行ID以适合您的查询。如果您想“命名”每一行中的单元格,以使代码更“可读”,那么这是一项开销,而且无论如何都需要足够长的时间才能运行
编辑 从逻辑上讲,它在文件a中循环,依次测试每一行,看看它是否符合where标准,忽略任何不匹配的行,然后转到下一行。如果它确实找到了一个匹配项,那么它会对文件b进行查找,循环查找,直到找到任何匹配项为止(这里的If测试)。如果它确实找到了一个与b匹配的对象,那么它将循环与c匹配。如果在c中找到匹配项(再次进行If测试),则会显示结果(将select中的值写入所有3个文件中以逗号分隔的列表)。如果在c中找不到匹配项,那么它将显示a和b中的值,并使用null而不是c中的任何值。如果在b中找不到匹配值,则它会针对c循环查找匹配项,并显示a和c中的任何匹配项,其中b中的select值为null。如果在b或c中都没有找到匹配的值,则显示b和c单元格的a值和空值。b和c循环的倒带确保循环始终从文件开始检查
除了遍历整个文件之外,没有简单的方法可以搜索csv。如果内存不受限制,可以对每个文件循环一次,并根据索引缓存结果,以使后续循环更容易,但PHP不是内存密集型任务的合适语言
当然,如果你有无限的内存,并且可以将每个文件的全部加载到3个数组中,那么你可以使用像LINQ这样的查询工具来处理查询,你到底想让我们做什么,此外,你几乎肯定会等待很长时间,甚至从csv文件执行一次,更不用说1000次,而编码这样做将花费数小时/天而不是数分钟。。。。。这是可以做到的,但是你为什么要让自己经历痛苦呢?@MarkBaker因为我想做比较,因为我想学习,但我不知道怎么可能,从哪里开始,因为我还没有做过这样的事情,起点和做什么会很有帮助,因为在那之后我还想用python来测试这一点,在mysql上执行大约需要50秒,我想知道php是如何完成的,时间是多少needed@MarkBaker有很多方法,我们可以每天编写代码,做或多或少相同的工作,相同的任务,或者你可以做编程,尝试学习一些新的方法,这一个,我真的不知道,我想我知道需要做什么,但我真的不知道怎么做,老实说,我不知道给我5分钟时间给你写一个骨架。。。。你会从中学到一些东西,如果你想做任何事情,就不要去做performance@MarkBaker好的,非常感谢你,任何形式的帮助都是欢迎的首先,非常感谢你的帮助,我真的很感谢你的时间和努力,这对我来说真的很重要,老实说,我现在都不知道这有什么用,我在“一些文本”部分添加了我的csv文件,我输入了我想要的内容,它返回了一行值,但我不知道为什么它会返回这些值,所以我会看看我能做什么,这不是我想要的,但可能是一个好的起点,我会接受你的答案。我必须说,我想了解一下你们的逻辑和思想,这样我就可以像你们一样编写算法了,非常感谢马克,你们太棒了!