我只处理了PHP的一个一对一的关系,到目前为止,但我卡在其中涉及一个一对多的关系的问题。我已经坐在这了,没有运气了几天,所以,我渴望有人来介入并告诉我一个解决方案之前,我失去了我的脑海。

在我的数据库有一系列的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获取数组,结果看起来酷似它上面一样。那是伟大的,但我需要的是为它读一些这样的:

link_id = 4   url = 'http://www.somesite2.com'   category = 'travel fun misc'

因此,基本上所有的类别对每个URL的得到某种方式组合,因为它们被打印出来。我第一次尝试促使我尝试嵌套while循环,但它没有工作,我不知道这是可行的。除此之外,我想知道如果我可能需要一个多维数组(完整的猜测,我从来没有使用过的)。

我被链接ID如上订购这些结果,所以我知道,如果在本次循环的链路ID,相匹配的在最后一次迭代 - 然后我有一些东西,有一个以上类别..我认为我真的很接近,但我无法弄清楚。

任何想法?

有帮助吗?

解决方案

还有在MySQL的“GROUP_CONCAT”功能。 这应该做的正是你想要达到的目标。

是这样的:

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

其他提示

您应该使用一个连接表。

第一你有一个链接表

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

这应该ATLEAST让你开始。

需要使用一个控制中断算法。

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”作为一个通用的“工作”的事件,则可以推此出到阵列结构等,而不是...

使用键控上的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一对多的关系。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top