0

私は2つのテーブルを持っています - >

  • ユーザー

    user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
    username VARCHAR(200) NOT NULL
    
  • ping

    ping_id INT UNSIGNED NOT NULL AUTO_INCREMENT PPRIMARY KEY
    disqus_id VARCHAR(32) NOT NULL
    user_id INT UNSIGNED NOT NULL
    
    INDEX combo1(disqus_id,user_id)
    

このクエリを実行します->

EXPLAIN SELECT pings.*, username
          FROM pings
    INNER JOIN users USING(user_id)
         WHERE pings.disqus_id = 'post_168' AND user_id = '1'
      ORDER BY pings.ping_id DESC LIMIT 2

Extrapimgs の下の列にはUsing where; Using temporary; Using filesort、ユーザーの下には と表示されていますUsing where; Using join buffer

このクエリを実行します->

EXPLAIN SELECT pings.*, username
          FROM pings
     LEFT JOIN users USING(user_id)
         WHERE pings.disqus_id = 'post_168' AND user_id = '1'
      ORDER BY pings.ping_id DESC LIMIT 2

Extrapimgs の下の列にはUsing where、users の下は空です。

何が起こっている?

4

2 に答える 2

2

同じ結果セットを生成するための2つの異なる要件セットを持つ2つの異なるクエリを作成しています。

クエリ1:(内部結合)ping :テーブルに一致するuser_id値があるテーブルからのみ行を返すことができると述べていますusersusingそのため、チェック用に余分ながあります。

クエリ2:(LEFT JOIN) :テーブルからすべての行とテーブルから一致するすべての行を返すことができると述べています。ping user_idusers

ここでの際立った問題は、2番目のテーブルに一致する値があることを要求しているかどうかです。クエリ1では、一致する値があることを確認するために追加のチェックを追加する必要がありますが、クエリ2ではそうではありません。

于 2013-02-21T19:45:43.760 に答える
2
  • USING(column_list)句は、両方のテーブルに存在する必要がある列のリストを指定します。

したがって、使用している場合user_idは両方のテーブルにある必要がありますが、左結合はテーブル b ではなくテーブル a の値を返します

次の 2 つの句は意味的に同じです。

a LEFT JOIN b USING (c1,c2,c3)
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
于 2013-02-21T19:34:42.227 に答える