Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Database_One To Many - Fatal编程技术网

PHP并输出一对多结果

PHP并输出一对多结果,php,mysql,database,one-to-many,Php,Mysql,Database,One To Many,到目前为止,我只处理过php中的一对一关系,但我遇到了一个涉及一对多关系的问题。我已经坐在这上面好几天了,运气都不好,所以我非常希望有人能在我失去理智之前介入并给我一个解决方案 在我的数据库中,有一系列URL,这些URL由SELECT查询和其他各种字段从不同的表接收。每个url至少有一个与之关联的类别,但可以有多个类别。所以在我的结果中,我可能会看到一些类似的东西: link_id = 3 url= 'http://www.somesite1.com' category = 'uncat

到目前为止,我只处理过php中的一对一关系,但我遇到了一个涉及一对多关系的问题。我已经坐在这上面好几天了,运气都不好,所以我非常希望有人能在我失去理智之前介入并给我一个解决方案

在我的数据库中,有一系列URL,这些URL由SELECT查询和其他各种字段从不同的表接收。每个url至少有一个与之关联的类别,但可以有多个类别。所以在我的结果中,我可能会看到一些类似的东西:

link_id = 3   url= 'http://www.somesite1.com'   category = 'uncategorised'
link_id = 4   url= 'http://www.somesite2.com'   category = 'travel'
link_id = 4   url= 'http://www.somesite2.com'   category = 'fun'
link_id = 4   url= 'http://www.somesite2.com'   category = 'misc'
link_id = 3   url= 'http://www.somesite3.com'   category = 'uncategorised'
我有点想让它工作。当我使用while循环和mysql fetch数组循环并打印它们时,结果与上面的结果完全相同。那太好了,不过我需要的是它能读到如下内容:

link_id = 4   url = 'http://www.somesite2.com'   category = 'travel fun misc'
因此,基本上每个url的所有类别在打印出来时都会以某种方式进行组合。我的第一次尝试使我尝试了一个嵌套的while循环,但它不起作用,我不确定这是否可行。除此之外,我想知道我是否需要一个多维数组(完全猜测,我以前从未使用过)

我按照上面的链接id对这些结果进行排序,所以我知道如果当前循环迭代中的链接id与上一次迭代中的链接id匹配,那么我就有了不止一个类别的东西。。我想我真的很接近,但我就是想不出来


有什么想法吗?

您应该使用连接表

首先,你有一个链接表

id = 1 url = something
id = 2 url = something else
然后你有一个类别表

id = 1 category = something
id = 2 category = something else
然后你有一个连接表

url_id = 1 category_id = 1
url_id = 1 category_id = 2
url_id = 2 category_id = 1

这至少可以让您开始使用。

使用在id和url上键入的数组遍历这些值并按如下方式添加到其中:

$link_categories[ $id ] .= $category." ";

$result = mysql_query("SElECT * FROM LINKS");

$link_categories = array();

while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
{
    if (!isset($link_categories[$row['link']]))
        $link_categories[$row['link']] = " ";
    else
        $link_categories[$row['link']] .= " ";

    $link_categories[$row['link']] .= $row['category'];
}

print_r($link_categories);
结果:

Array
(
    [http://a.com] =>  test evaluate performance
    [http://b.com] =>  classify reduce
    [http://c.com] =>  allocate
)
这不是这样做的“正确”方式-实际上,关系应该在
使用1-many关系分隔表

您需要使用控制中断算法

set last_link variable to null
set combined_category to null
exec query

loop over result set {
    if last_link == null {
        last_link=fetch_link
    }
    if fetch_link==last_link {
        set combined_category+=ltrim(' '.fetch_category)
    } else {
        display html for last_link and combined_category
        set last_link=fetch_link
        set combined_category=fetch_category
    }
}//loop

display html for last_link and combined_category
我使用“display html”作为通用的“work”事件,您可以将其推送到数组结构中,等等。相反,mysql中还有“GROUP_CONCAT”函数。 这正是你想要实现的

比如:

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 

啊,对不起,我应该说得更清楚一点。如果我理解正确的话,我确实有这样的设置。一个名为categories的表,只是一个存储所有现有类别的存储库,然后是一个只包含url的表,然后是一个包含url\u id和cat\u id的表,将它们连接在一起。没问题:)如果您想这样做,我将保留答案,直到您更新问题。这在我运行查询时非常有效,当我把它插入我的php脚本时。我没有意识到这个功能,但这正是我所追求的。谢谢