我似乎无法想象我的生活:x
我有两张桌子..
当我查询配置文件时,每个配置文件在标记链接表中可以有多个条目。 一旦我检索到标签链接,我想从标签数据表中获取标签文本。
我可以这样做:
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'
答案 0 :(得分:-1)
您的第一个查询看起来很好。如果它花了5-8秒,那么你可能错过usersProfilesTags(userId)
上的索引。
尝试在一个查询中执行此操作比执行两个单独的查询更困难并且可能更慢:一个查询获取配置文件,另一个查询获取标记。通常,当您运行多个简单查询而不是一个大型复杂查询时,MySQL的效果最佳。子查询是一个相对较新的功能,通常表现不佳。
另请注意,GROUP BY
查询缺少GROUP_CONCAT()
。您需要列出userProfiles
列表中GROUP BY
中的每一列。