我正在开发一个名为PHP-Bouncer的开源项目,而我正在为此编写的MySQL查询遇到问题。基本上,我们有三个表:BouncerRoles,PageInRole和BouncerPageOverrides。BouncerRoles包含访问级别,另外两个表通过外键链接回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
我在查询中做错了什么导致这种情况吗?
您可能正在将一个表与具有1..n关系的两个表连接在一起,从而产生重复的结果。
使用GROUP_CONCAT( DISTINCT ...)或
GROUP_CONCAT( DISTINCT ...)
使用两个子查询:在每个子查询中GROUP_CONCAT(),在2个表中的每个表上使用group by。然后连接两个子查询和主表。
GROUP_CONCAT()