Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接csv文件并进行排序,使其看起来像SQL查询的结果_Php_Mysql_Arrays_Csv - Fatal编程技术网

Php 连接csv文件并进行排序,使其看起来像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

我有一个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_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文件,我输入了我想要的内容,它返回了一行值,但我不知道为什么它会返回这些值,所以我会看看我能做什么,这不是我想要的,但可能是一个好的起点,我会接受你的答案。我必须说,我想了解一下你们的逻辑和思想,这样我就可以像你们一样编写算法了,非常感谢马克,你们太棒了!