2

質問が重複しているように見えることは知っていますが、別の方法で質問する方法がわかりません。

MySQLデータベースに2つの非常に単純なテーブルがあります。1つ目はテーブルです。Users

id,   user_id
 1       1
 2       3
 4       4

2番目はテーブルフレンズです

id,    user_id,    friend_id
 1        1             3
 2        1             4
 3        1             8

クリーンアップしたいCSVファイルからデータをダンプしました。表1にもfriend_idが存在するかどうかを確認する必要があります。最初のテーブルには約30000行ありますが、2番目のテーブルには約3000万行あります。

そして、私はこのクエリを使用してチェックします


SELECT u.user_id, uf.friend_id as exists_friend_ids
FROM Users u, Friends uf
WHERE u.user_id = '1'
    and uf.friend_id IN (select user_id from eventify.Users)

ただし、希望する出力はこれですが、上記のクエリを実行して実際にテスト結果を取得することはできないため、続行できません。

user_id,   exists_friend_ids
    1            3
    1            4

Usersテーブルに存在しないため、8が存在しないことがわかります。しかし、2番目のテーブルには3000万を超えるレコードがあるため、私のコンピューターでは永久に実行されています。私はそれを正しくやっていますか、それともこれがそれをする唯一の方法です。または、代わりにHadoopを学ぶ必要がありますか?

等結合を使用するようにクエリを更新しました。

4

3 に答える 3

3

GROUP BYfriend_idを使用してLEFTJOINクエリを試しましたか?ユーザーが存在しない場合、結果に行は追加されません。

于 2013-02-03T23:17:34.793 に答える
0

テーブルをクリーンアップするだけの場合は、クエリの実行が遅くなるという事実は、一度だけ実行する必要があるため、大きな影響はないため、ある程度の柔軟性があります。ここにいくつかの異なるオプションがあります:

  1. 左結合を使用して、usersテーブルに対応するフレンドIDがないフレンドの行を検索します(テストされていません)。

    SELECT Friends.id、Users.user_id FROM Friends LEFT JOIN Users on Friends.friend_id = Users.user_id WHERE Users.user_id is NULL

    次に、見つけたレコードを削除します

  2. 内部結合を使用して、存在する友達をフィンします。次に、それらのレコードを使用して新しいテーブルを作成します(テストされていません)

    SELECT Friends.id、Users.user_id FROM Friends INNER JOIN Users on Friends.friend_id = Users.user_id

    そして、結果の行を新しいテーブルに挿入します。これが新しい「友達」テーブルになります。

お役に立てば幸い

于 2013-02-03T23:38:21.567 に答える
-1

ここでCASEコンストラクトを実行する理由がわかりません。usersテーブルに存在しないすべてのfriend_idのリストを取得する場合は、次のようになります。

select friends.friend_id,
       count(*) 
  from friends
 where friends.friend_id not in (select users.user_id
                                   from users)
 group by 1

もちろん、users.user_id...にインデックスがあります。

于 2013-02-03T23:18:45.467 に答える