PHP并输出一对多的结果

时间:2009-02-12 14:26:42

标签: php mysql database one-to-many

到目前为止,我只处理过php中的一对一关系,但我遇到了一个涉及一对多关系的问题。我一直坐在这里几天没有运气,所以我很想有人介入并在我失去理智之前向我展示解决方案。

在我的数据库中有一系列URL,它们由SELECT查询以及来自不同表的各种其他字段接收。每个网址至少有一个与之关联的类别,但可以包含多个类别。所以在我的结果中,我可能会看到一些看起来像这样的东西:

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'

因此,基本上每个网址的所有类别都会以某种方式组合在一起,因为它们已打印出来。我的第一次尝试让我尝试了嵌套的while循环,但它没有用,我不确定这是否可行。除此之外,我想知道我是否需要一个多维数组(完全猜测,我以前从未使用过)。

我按照上面的链接ID对这些结果进行排序,所以我知道当前循环迭代中的链接ID是否与上一次迭代中的链接ID匹配 - 然后我有一些具有多个类别的东西......我认为我真的很亲密,但我无法理解。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

mysql中还有“GROUP_CONCAT”函数。 这应该完全符合你想要的目标。

类似的东西:

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

答案 1 :(得分:0)

您应该使用连接表。

1,你有一个链接表

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

至少应该让你开始。

答案 2 :(得分:0)

使用键入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
)

这不是“正确”的做法 - 实际上关系应该用a来定义 单独表与1多关系。

答案 3 :(得分:0)

您需要使用控制中断算法。

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”事件,你可以把它推到数组结构等等......而不是......