0

右側のテーブルにないレコードのみを左側のテーブルから取得しようとしています。左のテーブルには約 5000 件のレコードがあります。同様に、3 ~ 4 個を超えるテーブルでも同じことを行う必要があります。残りの 3 ~ 4 個のテーブルにない最初のテーブルからレコードを見つける必要があります。同じ主キーまたは外部キーの概念が機能しています。

2 つのテーブルを取得する最初の試みでは、元の 5k レコードから 5,70,000 レコードを取得しました。レコードを繰り返します。

SELECT m.* FROM members m, pinnumber p where p.pinmemberid != m.memberid 

2 回目の試みでも、mysql ブラウザがハングアップしました。

SELECT m.* FROM members m
LEFT JOIN pinnumber p ON p.pinmemberid != m.memberid
LEFT JOIN customer c ON m.memberid != c.memberid

3回目の試みでもかなりの時間を稼いでいます

SELECT * FROM members m
         WHERE 1=1 AND AND not exists ( select 1 from pinnumber p where 1=1 And
         p.pinmemberid = m.memberid AND p.pinproductid LIKE '%Remit%')
         AND not exists ( select 1 from customer c where 1=1 and c.card_name is not null AND m.memberid = c.memberid )

これをどうするか教えてください。これに非等結合を配置する必要がある場合。

4

3 に答える 3

1

このクエリは、最初のテーブルmembersをテーブルpinnumberand と結合しようとしますcustomer:

SELECT m.*
FROM
  members m
  LEFT JOIN pinnumber p ON p.pinmemberid = m.memberid
  LEFT JOIN customer c ON m.memberid = c.memberid
WHERE p.pinmemberid is null and c.memberid is null

を使用しているため、クエリはメンバーのすべての行を返しますが、結合が成功しleft joinない場合は. これらの値がある行は、右側のテーブルに存在しない行です。AND の代わりに OR を使用することもできます。pinmemberidmemberidnullnull

条件付きの結合を使用すると!=、最初のテーブルのすべての行が、同じ ID を持つものを除いて、2 番目のテーブルのすべての行に対して乗算されます。

同じ結果を得る別の方法は次のとおりです。

SELECT members.*
FROM members
WHERE
  memberid not in (select pinmembedid from pinnumber)
  and memberid not in (select memberid from customer)

(必要に応じて AND を OR に置き換えます)。NOT IN 句は少し遅いかもしれませんが、理解しやすいです。

于 2012-12-12T23:25:41.110 に答える
0

ちなみに、あなたがやろうとしていたことは次のとおりです。

SELECT m.* FROM members m
LEFT JOIN pinnumber p ON p.pinmemberid = m.memberid
LEFT JOIN customer c ON m.memberid = c.memberid
where p.pinmemberid is null and c.pinmemberid is null

右側のleft joinテーブルにレコードがない場合、はNULL値を生成します。結合後にこれらをフィルタリングできます。

于 2012-12-13T02:48:12.990 に答える