是的,有一种方法可以进行这样的选择。实际查询实际上取决于您想要返回的结果集。你想要一排还是两排分开的?CallCenterId 是否应该在列表中重复?如果 CallCenterId 出现在 user=1 的列表中,您是否希望将 CallCenterId 从 user!=1 的列表中排除?所有这些都是可能的。
测试用例:
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');
对规范的一种可能解释是,您想要 user=1 的所有 CallCenterId 的列表,并且您想要出现在表中但未出现在 user=1 的列表中的 ALL 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
另一种可能的解释是,您希望在同一行返回两个 CallCenterID 列表,一个列表包含 user=1 的 CallCenterId,另一个列表包含除 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
如果这对您更有效,也可以将这些列表作为两个单独的行返回。
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 关键字),并消除列为user
NULL 的任何行(添加 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
如果这些都不是您想要的,您需要更清楚地指定您想要返回的结果集。