0

チュートリアルで、私はこのSQLクエリを見ました:

SELECT a.id as a_id, a.info as a_info, 
       b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b
ON a.id != b.id 
LIMIT 25

クエリは正常に機能していますが、 WHERE条件を追加する必要があります。私はテーブルを持っていますusers。テーブルstatsには列が含まれていますuser_idstatsたとえば、テーブルからすべてのユーザーを取得しようとしますが、users.city=1それでも方法、それを達成する方法を見つけることができません...

私の問題は、現在、別のJOIN(テーブル用)をクエリに入れる方法がわからないことusersです。

アドバイスをいただければ幸いです、ありがとうございます

4

4 に答える 4

1

だからこれはあなたが持っているものです...

これはあなたが返すものです

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 

これはそれが由来するところです

FROM stats AS a 
JOIN stats as b on a.id != b.id 

これはあなたが望む数です

LIMIT 25

したがって、usersテーブルを追加する場合は、他の結合の後にこれを追加します

JOIN users ON a.user_id = users.id

フィルタリングするには、結合後にこれを追加します

WHERE users.city=1

与える

SELECT a.id as a_id, a.info as a_info, b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b on a.id != b.id 
JOIN users ON a.user_id = users.id
WHERE users.city=1
LIMIT 25
于 2012-08-30T21:25:15.257 に答える
1

便宜上、元の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は、読みやすい方法でフォーマットされていると、操作がはるかに簡単になります。)

于 2012-08-30T21:26:34.680 に答える
1

これを行う1つの方法は次のとおりです。

SELECT a.id as a_id, a.info as a_info, 
       b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats as b
     ON a.id != b.id 
where a.user_id in (select user_id from users where users.city = 1)
LIMIT 25

これを結合として表現することもできます(MySQLではより効率的です)。

SELECT a.id as a_id, a.info as a_info, 
       b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b
     ON a.id != b.id 
JOIN users AS u
     ON a.user_id = u.user_id 
     AND u.city_id = 1
LIMIT 25
于 2012-08-30T21:26:34.693 に答える
1

クエリでテーブルをstats2回使用するので、実際にはusersテーブルにも2つの結合が必要になります。(統計Aおよび統計Bの場合)

SELECT a.id as a_id, a.info as a_info, 
       b.id as b_id, b.info as b_info 
FROM stats AS a 
JOIN stats AS b ON a.id != b.id 
JOIN users AS a_users ON a.user_id = a_users.id
JOIN users AS b_users ON b.user_id = b_users.id
WHERE a_users.city = 1 
   OR b_users.city = 1
LIMIT 25
于 2012-08-30T21:26:34.747 に答える