好的,这是我的mysql查询
SELECT GROUP_CONCAT(CallCenterID) FROM tbl_mytable WHERE USER=1;
因此,此查询为我提供了所有user=1
的查询。是否有办法让所有CallCenterID
user!=1
和user=1
都使用单个选择查询。
我想要的是像GroupConcat(CallCenterIds_not_in_user=1),GroupConcat(CallCenterIds_in_user=1)
答案 0 :(得分:2)
试试这个:
SELECT USER=1, GROUP_CONCAT(CallCenterID) FROM tbl_mytable GROUP BY USER=1
答案 1 :(得分:1)
是的,有办法做这样的选择。实际查询实际上取决于您想要返回的结果集。你想要一行还是两行? CallCenterId应该在列表中重复吗?您是否希望CallCenterId从用户列表中排除!= 1如果它出现在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');
对规范的一种可能解释是,您需要一个用户= 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列表,其中一个列表包含用户= 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
列IS 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
如果这些都不是您要找的,那么您需要更清楚地指定要返回的结果集。
答案 2 :(得分:0)
我想你想要所有这些,所以没有条件:
SELECT USER, GROUP_CONCAT(CallCenterID) FROM tbl_mytable ORDER BY USER
这意味着它甚至不会检查user
列。 ORDER BY
会将具有相似USER
值的记录组合在一起。
答案 3 :(得分:0)
您好试试这个吗?你指的是这样的东西吗?您可以将name
替换为callerid
,将someid
替换为userid
。我使用的用户标识只是表的唯一键,它不会根据您的userid
引用:)
查询
select group_concat(name)
from mytable
where someid = 1
group by someid
;
结果:
GROUP_CONCAT(NAME)
tim,ron,kate,pete