PHP和输出一个一对多结果
-
23-08-2019 - |
题
我只处理了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一对多的关系。
不隶属于 StackOverflow