【问题标题】:Mysql GROUP_CONCAT and IN query [closed]Mysql GROUP_CONCAT 和 IN 查询
【发布时间】:2014-01-14 19:22:18
【问题描述】:

我有一张像 EMPDetails 这样的表格

EmpID EmpName EmpFriendsID
1     Hari    2,3
2     Ramesh 
3     Suresh 

如果我提供 EmpID,我想要查询以检索 EmpFriends 名称。

如果提供 EmpID 1 的例子,结果应该是

1     Hari    2,3     Ramesh,Suresh

谢谢。

【问题讨论】:

  • 标准化您的原始表格是一种选择吗?因为这真的应该是你的首要任务......
  • @LukasEder 是对的。下面的解决方案使用 FIND_IN_SET() 最终会得到正确的结果。但是它不能被索引,所以它必须对 both 表进行表扫描。如果您有超过几百行的数据,您将不会对性能感到满意。

标签: mysql sql select group-concat find-in-set


【解决方案1】:

要加入表使用FIND_IN_SET(),然后对记录进行分组并使用GROUP_CONCAT() 连接朋友姓名

SELECT t.EmpID,t.EmpName,t.EmpFriendsID,
       GROUP_CONCAT(t1.EmpName)
FROM t
LEFT JOIN t as T1 on FIND_IN_SET(t1.EmpID,t.EmpFriendsID)
WHERE t.EmpID=1
GROUP BY (t.EmpID)

SQLFiddle demo

【讨论】:

  • 嗨@valex,感谢您的解决方案。如果我知道在有大量记录时查询在性能方面的效率如何,我会很高兴。再次感谢!
  • @user1650864 我同意@BillKarwin 和他对您问题的评论。使用这种非规范化的表结构对性能不友好。如果没有全表扫描,您将无法连接这些表。即使您在EmpFriendsID 上有索引,也无法使用。相反,您应该创建关系表,例如[EmpId,FriendId],而不是EmpFriendsID="2,3",您将在此表((1,2)(1,3)) 中获得两行。在这种情况下,您可以使用索引,这种数据库结构在处理大量记录时会更快。
【解决方案2】:

使用FIND_IN_SET()函数

试试这个:

SELECT E1.EmpID, E1.EmpName, GROUP_CONCAT(E2.EmpFriendsID)
FROM EMPDetails E1
LEFT JOIN EMPDetails E2 ON FIND_IN_SET(E2.EmpID, E1.EmpFriendsID)
GROUP BY E1.EmpID

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 2012-07-28
    • 2013-03-08
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2012-10-24
    相关资源
    最近更新 更多