来自多个子查询的GROUP_CONCAT?

时间:2010-12-16 00:02:53

标签: php sql mysql

我似乎无法想象我的生活:x

我有两张桌子..

  • 1 =标记链接
  • 2 =标签数据

当我查询配置文件时,每个配置文件在标记链接表中可以有多个条目。 一旦我检索到标签链接,我想从标签数据表中获取标签文本。

我可以这样做: SELECT * FROM platform.tagWords WHERE tagId IN (SELECT tagId FROM platform.user sProfilesTags WHERE userId = 1001)

但它遍历每个标记(大约50,000),然后检查它是否已分配给用户,因此这不是一个解决方案,因为每个查询需要5-8秒。

有没有办法扭转这种局面?

非常感谢任何提示或建议。

提前致谢!

*更新

所以我试图用连接来刺激它,但我也被困在那里:P

SELECT                                                                          

  GROUP_CONCAT(tagWords.tagWord SEPARATOR ', ') AS tags,                        
  usersProfiles.*                                                                

FROM platform.users u                                                          

INNER JOIN platform.usersProfilesTags ON usersProfilesTags.userId = u.userId   
INNER JOIN platform.usersProfiles ON usersProfiles.userId = u.userId           
INNER JOIN platform.tagWords ON tagWords.tagId = usersProfilesTags.tagId       

WHERE u.userName = 'mattstest'

1 个答案:

答案 0 :(得分:-1)

您的第一个查询看起来很好。如果它花了5-8秒,那么你可能错过usersProfilesTags(userId)上的索引。

尝试在一个查询中执行此操作比执行两个单独的查询更困难并且可能更慢:一个查询获取配置文件,另一个查询获取标记。通常,当您运行多个简单查询而不是一个大型复杂查询时,MySQL的效果最佳。子查询是一个相对较新的功能,通常表现不佳。

另请注意,GROUP BY查询缺少GROUP_CONCAT()。您需要列出userProfiles列表中GROUP BY中的每一列。