0

わかりましたので、これが私のmysqlクエリです

SELECT GROUP_CONCAT(CallCenterID) FROM tbl_mytable WHERE USER=1;

したがって、このクエリは、単一の選択クエリを使用して、および両方を持つuser=1すべてのクエリを取得する方法はありますか。CallCenterIDuser!=1user=1

私が欲しいのは次のようなものですGroupConcat(CallCenterIds_not_in_user=1),GroupConcat(CallCenterIds_in_user=1)

4

4 に答える 4

2

これを試して:

 SELECT USER=1, GROUP_CONCAT(CallCenterID) FROM tbl_mytable GROUP BY USER=1
于 2012-12-13T14:41:26.300 に答える
1

はい、そのような選択を行う方法があります。実際のクエリは、返される結果セットによって異なります。1 つの行または 2 つの別々の行が必要ですか? CallCenterId はリスト内で重複する必要がありますか? user=1 のリストに CallCenterId が表示される場合、user!=1 のリストから CallCenterId を除外しますか? それらのすべてが可能です。


ここで SQL フィドル


テストケース:

CREATE TABLE tbl_mytable( `user` INT UNSIGNED, CallCenterId VARCHAR(2));
INSERT INTO tbl_mytable 
 VALUES (1,'a'),(1,'b'),(2,'a'),(2,'c'),(2,'a'),(2,'d'),(NULL,'x');

この仕様の考えられる解釈の 1 つは、user=1 のすべての CallCenterId のリストが必要であり、テーブルに表示されているが user=1 のリストに表示されていないすべての CallCenterId の別のリストが必要であるというものです。基本的に、CallCenterId をどちらか一方のリストに表示する必要がありますが、両方には表示しないでください。テストケースでは、これは次のようなものを返すことを意味します:

user=1  NOT user=1  
------  ----------
a,b     c,d,x

その結果セットは、次のようなクエリで返すことができます。

SELECT GROUP_CONCAT(IF(user_one,t.CallCenterId,NULL) 
       ORDER BY t.CallCenterId
       ) AS `user=1`
     , GROUP_CONCAT(IF(user_one,NULL,t.CallCenterId)
       ORDER BY t.CallCenterId
       ) AS `NOT user=1`
  FROM ( 
         SELECT u.CallCenterId
              , MAX(IF(u.user=1,1,0)) AS user_one
           FROM tbl_mytable u
          GROUP BY u.CallCenterId
       ) t

もう 1 つの考えられる解釈は、2 つの CallCenterID リストが同じ行に返されるようにすることです。1 つのリストには user=1 の CallCenterId が含まれ、もう 1 つのリストには user=1 以外のすべてのユーザーのすべての CallCenterId が含まれます。つまり、同じ CallCenterId が両方のリストに表示されます。その場合、次のようなものが機能します。

SELECT GROUP_CONCAT(DISTINCT IF(t.`user`=1,t.CallCenterID,NULL)
       ORDER BY t.CallCenterId
       ) AS `user=1`
     , GROUP_CONCAT(DISTINCT IF(t.`user`!=1,t.CallCenterID,NULL)
       ORDER BY t.CallCenterId
       ) AS `user!=1`
  FROM tbl_mytable t

戻り値:

user=1  user!=1  
------  ---------
a,b     a,c,d

これらのリストを 2 つの別々の行として返すこともできます。

SELECT IF(t.`user`=1,'user=1','user!=1') AS `which_users`
     , GROUP_CONCAT(t.CallCenterID ORDER BY t.CallCenterId) AS `call_centers`
  FROM tbl_mytable t
 GROUP BY which_users
 ORDER BY which_users DESC

(注: 'user!=1' の call_centers リストには、user列が NULL である行の値も含まれます。これらの行は、わずかな調整で除外できます。)

which_users  call_centers  
-----------  --------------
user=1       a,b           
user!=1      a,a,c,d,x     

少し異なるクエリでは、リスト内の重複を排除し (DISTINCT キーワードを使用)、列がuserNULL である行を排除します (WHERE 句を追加します)。

SELECT IF(t.`user`=1,'user=1','user!=1') AS `which_users`
     , GROUP_CONCAT(t.CallCenterID ORDER BY t.CallCenterId) AS `call_centers`
  FROM tbl_mytable t
 WHERE t.user IS NOT NULL 
 GROUP BY which_users
 ORDER BY which_users DESC

戻り値:

which_users  call_centers
-----------  ------------
user=1       a,b
user!=1      a,c,d

これらのどれも探しているものではない場合は、返される結果セットをより明確に指定する必要があります。

于 2012-12-13T15:01:03.887 に答える
0

こんにちは、これを試してみませんか?あなたはこのようなものを指しているのですか?namecalleridで置き換えることができsomeidますuserid。私が使用したユーザーIDは、テーブルの一意のキーであり、あなたのユーザーIDを参照していませんuserid:)

参照SQLFIDDLE

クエリ

select group_concat(name)
from mytable
where someid = 1
group by someid
;

結果:

GROUP_CONCAT(NAME)
tim,ron,kate,pete
于 2012-12-13T14:43:06.240 に答える
0

私はあなたがそれらすべてを望んでいると思っているので、条件はありません:

SELECT USER, GROUP_CONCAT(CallCenterID) FROM tbl_mytable ORDER BY USER

これは、列をチェックすることさえしないことを意味しuserます。はORDER BY、同様のUSER値を持つレコードをグループ化します。

于 2012-12-13T14:39:11.243 に答える