You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询回赞指定用户的用户?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:12:49