Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 查找连接不良的表之间的链接(不确定公式)_Php_Mysql - Fatal编程技术网

Php 查找连接不良的表之间的链接(不确定公式)

Php 查找连接不良的表之间的链接(不确定公式),php,mysql,Php,Mysql,: 我不得不说,我远不是PHP和MySQL方面的专家,所以我不知道如何表述我的问题。这就解释了标题的模糊性。 我有两张表格写得很糟糕,但我不允许更改。他们共享的唯一内容是一个名为url的字段。它们没有主键或索引。 其结构如下: Shareholder ||| tags url1 | value1 ||| url1 | tag1 tag2 tag350 tag 400 url2 | value2 ||| url2 | tag8 tag4

:

我不得不说,我远不是PHP和MySQL方面的专家,所以我不知道如何表述我的问题。这就解释了标题的模糊性。 我有两张表格写得很糟糕,但我不允许更改。他们共享的唯一内容是一个名为url的字段。它们没有主键或索引。 其结构如下:

Shareholder       |||   tags

url1 |  value1      |||      url1 | tag1 tag2 tag350 tag 400

url2  | value2      |||     url2 | tag8 tag400 tag350

url3  | value1      |||   url3 | tag2 tag1

url4 | value1       |||    url4 | tag5 tag 600

url5 | value2        |||   url5  | tag 60 tag8
从这些表中,我必须按股东找到标签的平均数量,例如,股东为value1、value2。
例如,预期输出为股东1(值1)

用一个临时数组按url来计算标记的数量是相当容易的。然后我想我必须把这些价值加在相关股东身上,但我迷失了方向。我不知道如何解决这个问题,甚至不知道如何将这种类型的PHP/SQL问题形式化。 我做了一次尝试,但自然失败了。不过我还是把它贴在下面。 有人能帮我吗

$sqlprim = "SELECT DISTINCT content FROM shareholder";
$deletedtermsprim = mysql_query ($sqlprim);

while ($rowprim = mysql_fetch_array($deletedtermsprim))
{
$tagsbyshareholder = array();
foreach ($rowprim as $keys1 => $values1)
{
    $sql = "SELECT url FROM shareholder WHERE content like \"$values1\"";
    $output1 = mysql_query($sql);
    $deletedterms = array("tags", "[", "]", ":");
while ($row = mysql_fetch_array($output1)) {
    foreach ($row as $columnName => $columnUrl) {
        $sql2 = "SELECT content
FROM tags WHERE url like\"$columnUrl\"";
$deletedterms = mysql_query($sql2);
while ($row2 = mysql_fetch_array($deletedterms)) 
{
    foreach ($row2 as $keys2 => $columntags); 
    {
        $preparedtags = str_replace($deletedterms, "", $columntags);
        $temporaryarray = explode(" ", $preparedtags);
        $temporaryarray = array_values(array_filter($temporaryarray));
        $countedtagsbyurl = count($temporaryarray);
        array_push($tagsbyshareholder, $countedtagsbyurl);
        }
}
}
}

}
foreach ($tagsbyshareholder as $countitems => $numberoftagsbyshareholder);
            echo $values1. ";". $numberoftagsbyshareholder;
            echo "<br />";
}
$sqlprim=“从股东中选择不同的内容”;
$deletedtermsprim=mysql\u查询($sqlprim);
while($rowprim=mysql\u fetch\u数组($deletedtermsprim))
{
$tagsbyshareholder=array();
foreach($rowprim作为$keys1=>$values1)
{
$sql=“从股东处选择url,其中包含像\“$values1\”这样的内容;
$output1=mysql\u查询($sql);
$deletedterms=array(“tags”、“[”、“]”、“:”;
而($row=mysql\u fetch\u数组($output1)){
foreach($columnName=>$columnUrl的行){
$sql2=“选择内容
来自url类似“$columnUrl”的标记;
$deletedterms=mysql\u查询($sql2);
而($row2=mysql\u fetch\u数组($deletedterms))
{
foreach($row2作为$keys2=>$columntags);
{
$preparedtags=str_replace($deletedterms,“,$columntags);
$temporaryarray=explode(“,$preparedtags);
$temporaryarray=数组_值(数组_过滤器($temporaryarray));
$countedtagsbyurl=count($temporaryarray);
阵列推送($tagsbyshareholder,$countedtagsbyurl);
}
}
}
}
}
foreach($tagsbyshareholder as$countitems=>$numberoftagsbyshareholder);
echo$values1.“;”$numberoftagsbyshareholder;
回声“
”; }
这可能会帮助您解决问题中的SQL部分,我认为这将简化您在PHP中的操作。您的数据库可能没有正常化,或者有PKs等,但是您仍然可以在两个表上进行连接

例如,此查询:

SELECT s.url, s.content, t.content 
FROM shareholder s
INNER JOIN tags t 
ON s.url = t.url
返回

url1    value1  tag1 tag2 tag350 tag400
url2    value2  tag8 tag400 tag350
url3    value3  tag2 tag1
url4    value4  tag5 tag600
url5    value5  tag60 tag8

在你的样本数据上。这种带有内部连接的查询可以将两个表拉到一起,这肯定有助于避免PHP中的大量嵌入循环。这似乎特别重要,因为您正在尝试为外部循环的每次重复运行select查询。

这可能会帮助您解决问题的SQL部分,我认为这将简化您在PHP中的操作。您的数据库可能没有正常化,或者有PKs等,但是您仍然可以在两个表上进行连接

例如,此查询:

SELECT s.url, s.content, t.content 
FROM shareholder s
INNER JOIN tags t 
ON s.url = t.url
返回

url1    value1  tag1 tag2 tag350 tag400
url2    value2  tag8 tag400 tag350
url3    value3  tag2 tag1
url4    value4  tag5 tag600
url5    value5  tag60 tag8

在你的样本数据上。这种带有内部连接的查询可以将两个表拉到一起,这肯定有助于避免PHP中的大量嵌入循环。这似乎特别重要,因为您正试图为外部循环的每次重复运行select查询。

您确实应该规范化tags表。在一个字段中存储多个值会破坏建立关系数据库的目的。一旦你恢复正常,剩下的问题基本上就消失了。谢谢你的回答。是的,这是最好的办法,但我不允许这样做。您认为在构建数据库时无法管理任务吗?您可以研究使用
find\u in\u set()
函数来伪造一个用于连接目的的规范化表,例如
在find\u in\u set(股东,URL)上连接标记。
:@user146823您能否澄清标记表的模式。事实上,它是否像Marc B假设的那样只有两个字段:url和另一个字段,称为
content
,它存储多个标记,这些标记由一个空格分隔?是的,我有多个标记被一个空格分隔。您真的应该规范化标记表。在一个字段中存储多个值会破坏建立关系数据库的目的。一旦你恢复正常,剩下的问题基本上就消失了。谢谢你的回答。是的,这是最好的办法,但我不允许这样做。您认为在构建数据库时无法管理任务吗?您可以研究使用
find\u in\u set()
函数来伪造一个用于连接目的的规范化表,例如
在find\u in\u set(股东,URL)上连接标记。
:@user146823您能否澄清标记表的模式。事实上,它是否像Marc B假设的那样只有两个字段:url和另一个字段,称为
content
,它存储多个标记,用空格分隔?是的,我有多个标记,用空格分隔。谢谢Marc B和DavidHyogo,我成功了,即使脚本非常慢,也有40万条记录:)谢谢Marc B和DavidHyogo,我成功了,即使脚本非常慢,也有40万条记录:)