2009-02-12 87 views
3

我只處理了php中的一對一關係到目前爲止,但我堅持一個涉及一對多關係的問題。我一直坐在這裏好幾天沒有運氣,所以我非常渴望有人介入並在失去理智之前給我一個解決方案。PHP和輸出一對多的結果

在我的數據庫中有一系列的url,這些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相匹配 - 那麼我就擁有了一個以上的類別..認爲我非常接近,但我無法弄清楚。

任何想法?

回答

3

也有「GROUP_CONCAT」功能MySQL的。 這應該做你想要達到的。

喜歡的東西:

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
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 

這應該ATLEAST讓你開始。

+0

啊對不起,我應該做多一點清楚。如果我理解正確,我確實有這樣的設置。一個稱爲類別的表格,只是存在的所有類別的存儲庫,然後是隻包含url的表格,然後是包含url_id和cat_id的表格將它們連接在一起。 – Jon 2009-02-12 14:57:13

+0

沒問題:)我會保留答案,直到你更新問題,如果你想這樣做。 – 2009-02-12 15:16:55

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 
) 

這不是「正確」的方式做到這一點 - 真正的關係應該在一個 獨立表中定義,並且具有一對多的關係。

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」作爲一個普通的「工作」時,你可能會推動這一點的陣列結構等,而不是...