到目前为止,我只处理过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匹配 - 然后我有一些具有多个类别的东西......我认为我真的很亲密,但我无法理解。
有什么想法吗?
答案 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”事件,你可以把它推到数组结构等等......而不是......