PHP并输出一对多结果
到目前为止,我只处理过php中的一对一关系,但我遇到了一个涉及一对多关系的问题。我已经坐在这上面好几天了,运气都不好,所以我非常希望有人能在我失去理智之前介入并给我一个解决方案 在我的数据库中,有一系列URL,这些URL由SELECT查询和其他各种字段从不同的表接收。每个url至少有一个与之关联的类别,但可以有多个类别。所以在我的结果中,我可能会看到一些类似的东西: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
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脚本时。我没有意识到这个功能,但这正是我所追求的。谢谢