1

正しい電子メールを取得するために正常に機能する次のクエリがあり、次の結果が得られます。--user1@company.com --user2@company.com-etc

質問:結果がコンマで区切られるようにMySQL GROUP_CONCAT関数を追加するにはどうすればよいですか: -user1 @ company.com、user2 @ company.com、etc

これが私のUnionクエリの一部です。

-チケット番号を入力すると、チケットのチケットタイプの値がチェックされ、バックエンドテーブルでそのタイプがチェックされているユーザーのみが返されます。

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キーワードを使用できます。特定の順序で値を取得するには、ORDERBY句を使用できます。

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

繰り返しになりますが、関数によって返される文字列の長さは、GROUP_CONCATの値によって制限されることに注意してくださいmax_allowed_packet


フォローアップQ:リストからメールを「除外」または除外するにはどうすればよいですか。例:-SESSION.kt_email = "リスト内のメールの1つ"の場合、リストから削除します。

A:簡単な答えは例です。'foo'この例のために、除外する電子メールアドレスが1つしかない場合、たとえば、次のようにします。

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

ここでの秘訣は、の値を。に置き換え、'foo'NULLNULLGROUP_CONCATを「スキップ」して、戻り文字列から除外することです。

表現:

    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 に答える