1

我有以下查询可以正常获取正确的电子邮件,并给出以下结果: - user1@company.com - user2@company.com - 等

问题:如何添加 MySQL GROUP_CONCAT函数,以便结果用逗号分隔:- user1@company.com、user2@company.com 等

这只是我的联合查询的一部分:

- 当我向它提供票号时,它会检查票上的票证类型值并仅返回那些在后端表中检查了该类型的用户。

SELECT CONCAT(tblemailaction.uea_User, "@company.com") AS User_email,                 tblemailaction.uea_ADSL
FROM tblemailaction, tbltickets, tbltickettype
WHERE tbltickets.ttType = tbltickettype.ttDesc
 AND tbltickettype.ttID = tblemailaction.uea_ADSL
 AND ttNum = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.id#">


UNION ALL


SELECT CONCAT(tblemailaction.uea_User, "@company.com") AS User_email,          tblemailaction.uea_ADSL_INSTALL
FROM tblemailaction, tbltickets, tbltickettype
WHERE tbltickets.ttType = tbltickettype.ttDesc
 AND tbltickettype.ttID = tblemailaction.uea_ADSL_INSTALL
 AND ttNum = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.id#">

UNION ALL


SELECT CONCAT(tblemailaction.uea_User, "@company.com") AS User_email, tblemailaction.uea_Cabling
FROM tblemailaction, tbltickets, tbltickettype
WHERE tbltickets.ttType = tbltickettype.ttDesc
 AND tbltickettype.ttID = tblemailaction.uea_Cabling
 AND ttNum = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.id#">


UNION ALL


SELECT CONCAT(tblemailaction.uea_User, "@company.com") AS User_email, tblemailaction.uea_Calix
FROM tblemailaction, tbltickets, tbltickettype
WHERE tbltickets.ttType = tbltickettype.ttDesc
 AND tbltickettype.ttID = tblemailaction.uea_Calix
 AND ttNum = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.id#">
4

1 回答 1

2

首先,请注意GROUP_CONCAT函数受max_allowed_packet变量值的限制,通常设置为 1048576(即 1MB)。当然,这个变量的值可以增加,但要注意有一个限制。

快速的答案是将整个查询“包装”在一组括号中,并将其作为查询中的行源引用。基本上,将您的查询变成“内联视图”。

SELECT GROUP_CONCAT(v.User_email)
  FROM (
         /* your UNION ALL query here */
       ) q

要删除重复项,您可以使用 DISTINCT 关键字。要获取特定序列中的值,可以使用 ORDER BY 子句。

SELECT GROUP_CONCAT(DISTINCT v.User_email ORDER BY v.User_email)
  FROM (
         /* your UNION ALL query here */
       ) q

再次注意,GROUP_CONCAT函数返回的字符串的长度受 值的限制max_allowed_packet


后续问:我如何从列表中“排除”或过滤掉一封电子邮件。例如: - 如果 SESSION.kt_email = “列表中的电子邮件之一” 那么从列表中删除

答:快速回答是举例。如果您有一个要排除的电子邮件地址,例如'foo',为了这个示例:

SELECT GROUP_CONCAT( NULLIF(v.User_email,'foo') )
  FROM (
         /* your UNION ALL query here */
       ) q

这里的技巧是我们'foo'用 a替换任何值NULLGROUP_CONCAT并将“跳过”任何 NULL 值并将它们从返回字符串中排除。

表达方式:

    NULLIF(v.User_email,'foo')

是以下的简写:

    IF(v.User_email='foo',NULL,v.User_email)

这相当于(更多的ANSI标准):

    CASE WHEN v.User_email = 'foo' THEN NULL ELSE v.User_email END

当然,您可以将文字'foo'(在我的示例中)替换为您想要排除的任何字符串值或表达式。

于 2012-12-19T17:07:21.007 回答