2012-07-14 158 views
7

我正在開發一個名爲PHP-Bouncer的開源項目,我正在爲它編寫一個MySQL Query。基本上我們有三個表格:BouncerRoles,PageInRole和BouncerPageOverrides。 BouncerRoles包含訪問級別,另外兩個表通過外鍵鏈接到BouncerRoles並提供多個附加數據條目。我寫了下面的查詢,試圖拉我需要一次全部角色的數據:MySQL Group_Concat重複值

select BouncerRoles.RoleID, BouncerRoles.RoleName, 
GROUP_CONCAT(PageInRole.PageName separator '|') as ProvidedPages, 
GROUP_CONCAT(CONCAT(BouncerPageOverrides.OverriddenPage,'&',BouncerPageOverrides.OverridingPage) separator '|') as OverriddenPages 
from BouncerRoles join PageInRole on BouncerRoles.RoleID = PageInRole.RoleID 
join BouncerPageOverrides on BouncerRoles.RoleID = BouncerPageOverrides.RoleID 
group by BouncerRoles.RoleID; 

該查詢的目標是提供角色ID,角色名,提供頁面的管道分隔列表,一個管道分隔的覆蓋列表(以覆蓋頁面的覆蓋頁面&的形式)。一切正常,除了查詢的最後一列,其中重複發現遍地像這樣(以CSV格式輸出)的條目:

RoleID,RoleName,ProvidedPages,OverriddenPages 
2,Exchange,exchange-how.php|exchange-support.php|exchange.php|premium-promo.php|exchange-resorts.php|premiumplus-promo.php|exchange-deposit.php|exchange-requestdestination.php,whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php 
3,Premium,premiumplus-promo.php|premium-cruises.php|premium-resorts.php|premium-condohome.php|premium-hotelaircar.php|premium.php|premium-restaurants.php|premium-overview.php,premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php 
4,"Premium Plus",premiumplus-exclusiveescapes.php|premiumplus.php|premiumplus-overview.php|premiumplus-concierge.php|premiumplus-airportlounge.php,premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php 

有什麼我做錯了我的查詢導致此?

+1

記住,'GROUP_CONCAT'可以是一個痛苦的屁股,如果你有一個大的結果 - >只會返回一個規模有限的結果(我認爲1024個字節,但我不知道),因此,如果您的結果集更大,它會被切斷。 – Nanne 2012-07-14 18:27:45

+3

你在'GROUP_CONCAT'裏面是否缺少'DISTINCT'?看起來你的連接正在返回多行。 – 2012-07-14 18:28:48

+1

@nanne:該限制(1024)取決於一個設置。它可以延長。 – 2012-07-14 18:34:23

回答

21

您可能正在加入1..n關係中有兩個表的表格,產生重複的結果。

  • 選其一GROUP_CONCAT(DISTINCT ...)

  • 使用兩個子查詢:在每一個使用與GROUP_CONCAT()組通過對每個2個表。然後加入兩個子查詢和主表。

+0

添加與第二個group_concat不同的是訣竅...謝謝! – 2012-07-14 20:25:50

+0

有沒有其他選擇?與大數據集(在我的情況下)子查詢是非常緩慢,但我不能使用不同的,因爲我需要每個返回值,即使它是相同的.. – 2013-04-22 10:47:27

+0

@ ThomasClowes你可以發表一個問題然後,不要忘記包括實際的查詢,表的定義(包括索引)和執行計劃,你也可以在[http://dba.stackexchange.com/] (http://dba.stackexchange.com/)可能會更好張力。 – 2013-04-22 10:52:21