如何通过MySQL查询获取全量话题并标记用户已选话题?
解决方案
实现思路
要获取所有话题并标记已选项,不需要子查询,通过LEFT JOIN关联话题表和用户话题关联表,再结合CASE WHEN判断即可实现,逻辑简洁且性能更优。
直接返回带标记的话题名称(SQL拼接HTML)
如果需要直接在查询结果中返回带<strong>标记的已选话题,可执行以下SQL(替换123为目标用户的profile_id):
SELECT t.topic_id, CASE WHEN pt.profile_id IS NOT NULL THEN CONCAT('<strong>', UPPER(t.topic_name), '</strong>') ELSE t.topic_name END AS display_topic FROM TOPICS t LEFT JOIN PROFILE_TOPICS pt ON t.topic_id = pt.topic_id AND pt.profile_id = 123;
- 逻辑说明:
- 以
TOPICS为主表,通过LEFT JOIN关联PROFILE_TOPICS,保证所有话题都会被返回; - 利用
CASE WHEN判断当前话题是否存在于该用户的关联表中(pt.profile_id不为空则表示已选); - 已选话题会被
<strong>包裹并转为大写,未选话题直接返回原名称。
- 以
前后端分离方案(推荐)
实际开发中更推荐返回标记字段,由前端负责渲染样式,这样SQL逻辑更纯粹,也更灵活:
SELECT t.topic_id, t.topic_name, CASE WHEN pt.profile_id IS NOT NULL THEN 1 ELSE 0 END AS is_selected FROM TOPICS t LEFT JOIN PROFILE_TOPICS pt ON t.topic_id = pt.topic_id AND pt.profile_id = 123;
- 返回结果中
is_selected为1表示该话题已被用户选择,前端可根据这个值决定是否添加<strong>标签。
内容的提问来源于stack exchange,提问作者Alex Ollie
相关产品推荐
相关产品推荐

