为方便起见,我重新格式化了您的原始 SQL 语句,使其可供人类阅读。
SELECT a.id AS a_id
, a.info AS a_info
, b.id AS b_id
, b.info AS b_info
FROM stats a
JOIN stats b
ON a.id != b.id
LIMIT 25
您当前的查询几乎返回笛卡尔积。stats 中的每一行都与 stats 中的每一行匹配,除了匹配自身。(假设这stats.id
是一个主键或唯一键。)
要向 users 表添加连接,以限制从 返回的行a
,例如:
SELECT a.id AS a_id
, a.info AS a_info
, b.id AS b_id
, b.info AS b_info
FROM stats a
JOIN users au ON au.id = a.user_id AND au.city=1
JOIN stats b ON a.id != b.id
LIMIT 25
如果要限制返回的行a
和b
,请向表中添加另一个联接users
:
SELECT a.id AS a_id
, a.info AS a_info
, b.id AS b_id
, b.info AS b_info
FROM stats a
JOIN users au ON au.id = a.user_id AND au.city=1
JOIN stats b ON a.id != b.id
JOIN users bu ON bu.id = b.user_id AND bu.city=1
LIMIT 25
这不是实现这一目标的唯一方法。例如,您可以使用一个a.user_id IN (subquery)
或一个EXISTS (subquery)
谓词。
(如果您将 SQL 格式化为可读的格式,那么它的使用会容易得多。)