$unique = array();
$sql = "SELECT ID, TitleName, ArtistDisplayName, Mix FROM values_to_insert as A
WHERE A.ID = ";
//Get a single row from our data that needs to be inserted...
while($result = $conn->query(($sql. $count)))
{
//Get the $data of the single row query for inserting.
$data = mysqli_fetch_row($result);
$count++;
//SQL to get a match of the single row of $data we just fetched...
$get_match = "SELECT TitleName_ti, Artist_ti, RemixName_ti from titles as B
Where B.TitleName_ti = '$data[1]'
and B.Artist_ti = '$data[2]'
and B.RemixName_ti = '$data[3]'
LIMIT 1";
//If this query returns a match, then push this data to our $unique value array.
if(!$result = $conn->query($get_match))
{
//If this data has been pushed already, (since our data includes repeats), then don't
//put a repeat of the data into our unique array. Else, push the data.
if(!in_array($unique, $data))
{
echo 'Pushed to array: ' . $data[0] . "---" . $data[1] . "</br>";
array_push($unique, $data);
}
else
echo'Nothing pushed... </br>';
}
}
这需要5分钟以上,甚至没有任何内容打印到屏幕上。我很好奇吃了这么多时间吃什么,可能是一种替代方法或功能,无论它一直在吃什么。我想一些正确方向的指针会很棒。
此代码基本上获取表'A'的所有行,一次一个。检查表'B'中是否匹配,如果有,那么我不想要$ data,但如果没有,我会检查数据本身是否重复,因为我的表' A'有一些重复值。
表A有60,000行 表B有200,000行
答案 0 :(得分:2)
查询中的查询很少是个好主意
但是您的脚本似乎存在多个问题。在SQL中执行整个操作可能更容易,并且每次都将结果推送到数组。 SQL可以删除重复项: -
<?php
$unique = array();
$sql = "SELECT DISTINCT A.ID,
A.TitleName,
A.ArtistDisplayName,
A.Mix
FROM values_to_insert as A
LEFT OUTER JOIN titles as B
ON B.TitleName_ti = A.ID
and B.Artist_ti = A.TitleName
and B.RemixName_ti = A.ArtistDisplayName
WHERE B.TitleName_ti IS NULL
ORDER BY a.ID";
if($result = $conn->query(($sql)))
{
//Get the $data of the single row query for inserting.
while($data = mysqli_fetch_row($result))
{
array_push($unique, $data);
}
}
关于您的原始查询。
你有一个计数(我假设它被初始化为0,但是如果一个角色然后会做奇怪的事情),并获得具有该值的记录。如果第一个id为1,000,000,000,那么在找到要处理的记录之前,您已经完成了1b个查询。您可以通过删除WHERE子句并按ID排序来获取ID顺序中的所有行。
然后,您只需从第二个查询中获取单个记录,其中详细信息匹配,但仅在未找到记录时才处理它们。您不使用任何返回的值。您可以通过执行LEFT OUTER JOIN来获取匹配项,并检查WHERE子句中是否没有匹配项来完成此操作。
编辑 - 正如您所指出的,您似乎用于匹配记录的字段似乎在逻辑上不匹配。我已按照你的方式使用它们,但我希望你真的想将B.TitleName_ti与A.TitleName,B.Artist_ti与A.ArtistDisplayName和B.RemixName_ti匹配到A.Mix