12

PHP-Bouncerと呼ばれるオープンソースプロジェクトに取り組んでいますが、そのために作成しているMySQLクエリで問題が発生しています。基本的に、BouncerRoles、PageInRole、およびBouncerPageOverridesの3つのテーブルがあります。BouncerRolesにはアクセスレベルが含まれており、他の2つのテーブルは外部キーを介してBouncerRolesにリンクし、追加データの複数のエントリを提供します。必要なすべての役割データを一度に取得するために、次のクエリを作成しました。

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;

このクエリの目的は、RoleID、RoleName、提供されたページのパイプ区切りリスト、およびオーバーライドのパイプ区切りリスト(overriddenpage&overridingpageの形式)を提供することです。クエリの最後の列を除いてすべてが機能します。クエリの最後の列は、次のように何度も見つかったエントリを繰り返します(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

これを引き起こすためにクエリで間違ったことはありますか?

4

1 に答える 1

31

1..n関係の2つのテーブルでテーブルを結合している可能性があり、重複した結果が生成されます。

  • またはのいずれGROUP_CONCAT( DISTINCT ...)かを使用します

  • 2つのサブクエリを使用します。それぞれのサブクエリGROUP_CONCAT()で、2つのテーブルのそれぞれでgroupbyを使用します。次に、2つのサブクエリとメインテーブルを結合します。

于 2012-07-14T18:38:38.827 に答える