3

到目前为止,我只处理了 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 匹配 - 那么我有一些具有多个类别的东西。我想我是真的很接近,但我就是想不通。

有任何想法吗?

4

4 回答 4

3

mysql中还有“GROUP_CONCAT”函数。那应该正是您想要实现的目标。

就像是 :

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
于 2009-02-12T14:51:39.490 回答
0

您应该使用连接表。

第一个你有一个链接表

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

这至少应该让你开始。

于 2009-02-12T14:33:42.763 回答
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
)

这不是这样做的“正确”方式——实际上,关系应该在一个具有一对多关系的单独表中定义。

于 2009-02-12T14:43:22.070 回答
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

我将“显示 html”用作通用“工作”事件,您可以将其推送到数组结构等中...

于 2009-02-12T14:49:44.330 回答