便宜上、元の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.id
(それが主キーまたは一意キーであると想定します。)
ユーザーテーブルに結合を追加するには、から返される行を制限します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は、読みやすい方法でフォーマットされていると、操作がはるかに簡単になります。)