如何查询回赞指定用户的用户?MySQL关联表SQL实现
搞定互赞用户查询的正确姿势
嘿,我来帮你解决这个回赞用户的查询问题!首先咱们明确核心需求:你要找的是你(用户ID为1)点赞过,同时对方也给你点过赞的用户,也就是双向互赞的关系。
先说说原SQL的问题
你原来的语句用了两次左连接,但逻辑上没完全闭环:只关联了hh.heart = h.user,却没限定hh.heart必须是你自己(也就是'1'),而且左连接会引入不符合条件的空值记录,导致结果不准确,只能单向生效。
正确的SQL写法(两种实用方案)
先明确你的heart表结构(方便大家理解逻辑):
CREATE TABLE heart ( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, user INT(11) UNSIGNED NOT NULL, -- 点赞发起者ID heart INT(11) UNSIGNED NOT NULL, -- 被点赞者ID PRIMARY KEY (id) );
方案1:用EXISTS子查询(高效推荐)
这种方法逻辑最直观:先找出你点赞过的所有用户,再筛选出那些也给你点过赞的人,最后关联用户表获取昵称:
SELECT c.id AS mutual_user_id, c.user AS mutual_user_nickname -- 假设users表的昵称字段为user FROM heart h JOIN users c ON h.heart = c.id WHERE h.user = '1' -- 替换成你的用户ID AND EXISTS ( SELECT 1 FROM heart h_reciprocal WHERE h_reciprocal.user = h.heart -- 对方是点赞发起者 AND h_reciprocal.heart = '1' -- 对方点赞的对象是你 );
方案2:用自连接匹配双向记录
通过自连接把“你赞对方”和“对方赞你”的两条记录关联起来,再去重避免重复结果:
SELECT DISTINCT c.id AS mutual_user_id, c.user AS mutual_user_nickname FROM heart h_me JOIN heart h_them ON h_them.user = h_me.heart AND h_them.heart = h_me.user -- 双向点赞的核心匹配条件 JOIN users c ON h_me.heart = c.id WHERE h_me.user = '1'; -- 替换成你的用户ID
加DISTINCT是因为如果存在多次点赞的情况,会产生重复记录,去重后结果更干净。
为什么这两种方案能解决问题?
- 两种方案都严格保证了双向点赞的逻辑:既存在你→对方的点赞记录,也存在对方→你的点赞记录。
- 方案1的
EXISTS子查询在大数据量下性能更好,数据库只要找到匹配的记录就会停止查询,不用全表扫描。 - 方案2的自连接更直观,适合新手理解双向关系的匹配逻辑。
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

