寻找连接不良的表之间的链接(不确定配方)

时间:2012-07-25 14:06:47

标签: php mysql

我不得不说我远不是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。
例如,预期的输出将是shareholder1(value1)

使用临时数组通过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 />";
}

1 个答案:

答案 0 :(得分:1)

这可能会帮助您解决问题的SQL部分,我认为它将简化您在PHP中必须执行的操作。您的数据库可能没有正确规范化或具有PK等,但您仍然可以在这两个表上进行连接。

例如,此查询:

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查询。