2012-12-13 125 views
0

好了,所以这是我的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

原谅我,但你想要得到那些= 1和那些!= 1,是不是所有的人? – George

+1

下降条件! :) – tuxuday

+0

请向我们显示您的预期结果和表格结构。 – bonCodigo

回答

0

林想你想所有的人,所以没有条件:

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

这意味着,它甚至不会检查user列。 ORDER BY会将具有相似USER值的记录组合在一起。

+0

我想所有,但想知道哪一个是属于用户= 1,哪一个不是 – iJade

+0

@jade请参阅我的更新(: – George

2

试试这个:

SELECT USER=1, GROUP_CONCAT(CallCenterID) FROM tbl_mytable GROUP BY USER=1 
0

你好尝试了这一点?你是指这样的事情吗?您可以用calleridsomeid替换nameuserid。我已经使用的用户标识只是表的唯一关键,它不指userid按照你的:)

REference SQLFIDDLE

查询

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

结果:

GROUP_CONCAT(NAME) 
tim,ron,kate,pete 
+0

@Jade点击参考SQLfiddle链接,你可以看到结果:) – bonCodigo

1

是的,有一种方法可以做这样的选择。实际的查询实际上取决于你想返回的结果集。你想要一行还是两行? CallCenterId是否应该在列表中复制?你想CallCenterId排除列表中的用户!= 1,如果它出现在列表中的用户= 1?所有这些都是可能的。


SQL Fiddle Here


测试用例:规范的

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的列表,并你要出现在表中,但没有出现在列表中的用户= 1 ALL CallCenterId的另一个列表。基本上,你想要一个CallCenterId出现在一个列表或其他,但不是两个。在测试的情况下,这将意味着你会想回到这样的事情:

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

该ResultSet可以通过这样的查询返回:

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列表返回同一行上,用含有CallCenterId用户= 1一个列表,包含所有CallCenterId比用户= 1,意义以外的所有用户的其他列表,同样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 

(:“!用户= 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 

如果这些都不是你在找什么,你需要更加清晰地明确你想要返回什么结果集。

相关问题