Mysql 使用组_CONCAT

Mysql 使用组_CONCAT,mysql,sql,Mysql,Sql,我有三张桌子。TB_Main是一个实体表。TB_董事会成员是一组人。TB_BoardMembersLINK是一个桥接表,通过ID引用其他两个,并且还具有个人在实体董事会的开始和结束日期。这些日期通常是不完整的 我被要求作为报告的一部分导出一个CSV,每个实体每年一行,其中我有一份当年董事会成员的列表,其职业在一个由新行分隔的字段中 我在结果中不需要bml.Entity,但添加它是为了尝试调试。我只排了一排,预计是85排。经过分组和不分组的尝试,结果是一样的,这表明我滥用了分组。我应该如何构造它以

我有三张桌子。TB_Main是一个实体表。TB_董事会成员是一组人。TB_BoardMembersLINK是一个桥接表,通过ID引用其他两个,并且还具有个人在实体董事会的开始和结束日期。这些日期通常是不完整的

我被要求作为报告的一部分导出一个CSV,每个实体每年一行,其中我有一份当年董事会成员的列表,其职业在一个由新行分隔的字段中

我在结果中不需要bml.Entity,但添加它是为了尝试调试。我只排了一排,预计是85排。经过分组和不分组的尝试,结果是一样的,这表明我滥用了分组。我应该如何构造它以获得他们想要的结果

SELECT 
GROUP_CONCAT(
DISTINCT CONCAT(bm.First, ' ', bm.Last, 
IF (bm.Occupation != '', ' - ', ''),
bm.Occupation)  SEPARATOR "\n") as Board,
bml.Entity
FROM  
TB_Main arfe,
TB_BoardMembers  bm,
TB_BoardMembersLINK  bml
WHERE YEAR(bml.start) <= 2011 
AND (YEAR(bml.end) >= 2011 OR bml.end IS NULL)
AND bml.start > 0 
AND bml.Entity = arfe.ID
GROUP BY bml.Entity
ORDER BY Board
选择
组_CONCAT(
不同的CONCAT(bm.First,,,bm.Last,
如果(bm.职业!='','','',
bm.职业)分隔符“\n”)作为板,
实体
从…起
TB_Main arfe,
TB_董事会成员bm,
TB_董事会成员链接bml
其中年份(bml.start)=2011年或bml.end为空)
和bml.start>0
和bml.Entity=arfe.ID
按bml.实体分组
董事会命令

如果您阅读了组目录

“此函数返回一个字符串结果,其中包含组中连接的非空值。”

在这种情况下,集团似乎只是一个集团,就像你说的只有一个实体?根据你的描述,我不确定情况是否如此。你为什么不按名字、姓氏和职业分组呢?这可能会给你所有的成员


我也不确定你的连接,没有真实的数据很难解释这一部分,因为每个连接都适用于某些数据集,即使这不是编写查询的最佳方式,但此查询存在一些问题。主要问题似乎是您缺少将董事会成员链接到链接表的条件,因此您有一个交叉连接,即您将返回每个宽带成员,而不管其开始/结束日期如何,并且假设您有85行符合条件,您将实际返回每个董事会成员85次。这突出了一个很好的理由,可以将您正在使用的ANSI 89隐式联接转换为ANSI 92显式联接语法。重点介绍了进行切换的一些非常好的理由

因此,您的查询将变成(我不得不猜测您的字段名):

关于您的查询,我注意到的下一件事是在where子句中使用函数根本不是很有效,因此:

WHERE   YEAR(bml.start) <= 2011 
AND     (YEAR(bml.end) >= 2011 OR bml.end IS NULL)
然后,您的最终查询应该是:

SELECT  bml.Entity,
        GROUP_CONCAT(DISTINCT CONCAT(bm.First, ' ', bm.Last, 
            IF (bm.Occupation != '', ' - ', ''), bm.Occupation) 
            SEPARATOR "\n") as Board
FROM    TB_Main arfe
        INNER JOIN TB_BoardMembersLINK  bml
            ON bml.Entity = arfe.ID
        INNER JOIN TB_BoardMembers  bm
            ON bm.ID = bml.BoardMemberID
WHERE   bml.Start <= '20110101'
AND     (bml.End >= '20110101' OR bml.End IS NULL)
AND     bml.start > 0
GROUP BY bml.Entity
ORDER BY Board;
选择bml.Entity,
组_CONCAT(不同的CONCAT(bm.First,,,bm.Last,
如果(bm.职业!='','',bm.职业)
分隔符“\n”)作为板
来自TB_Main arfe
内部连接TB_板成员链接bml
在bml.Entity=arfe.ID上
内部加入TB_董事会成员bm
在bm.ID=bml.BoardMemberID上
其中bml.Start='20110101'或bml.End为空)
和bml.start>0
按bml.实体分组
董事会命令;

我想问题不在于
组连接,而在于不正确的连接。感谢您提供了这么好的解释!我喜欢这样的课程!
WHERE   bml.Start <= '20110101'
AND     (bml.End >= '20110101' OR bml.End IS NULL)
AND     bml.start > 0 
SELECT  bml.Entity,
        GROUP_CONCAT(DISTINCT CONCAT(bm.First, ' ', bm.Last, 
            IF (bm.Occupation != '', ' - ', ''), bm.Occupation) 
            SEPARATOR "\n") as Board
FROM    TB_Main arfe
        INNER JOIN TB_BoardMembersLINK  bml
            ON bml.Entity = arfe.ID
        INNER JOIN TB_BoardMembers  bm
            ON bm.ID = bml.BoardMemberID
WHERE   bml.Start <= '20110101'
AND     (bml.End >= '20110101' OR bml.End IS NULL)
AND     bml.start > 0
GROUP BY bml.Entity
ORDER BY Board;