2011-09-12 6 views

答えて

7

このクエリは、コンタクトIDのすべての可能なペアを含むテーブルを作成します。連絡先IDが1、2、3であれば

はたとえば、あなたは結果

1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 
2

これは簡単な答えです:この例に記載されているクエリを使用してください。それはうまくいくはずです。これはあなたが二度同じテーブルを使用したい場合、あなたは彼らが異なっていたとして、「それらの」テーブルを結合する必要があることに注意してください、おそらく悪いアイデアではあるが:

SELECT c1.id as sender, c2.id as replier 
FROM contacts c1, contacts c2 
WHERE sender.id = replier.id 
+1

WHERE句が動作するためのテーブル 'sender'ま​​たは' replier'はありません。 2つのテーブルが同じテーブルである場合には、「異なるテーブルに参加する必要があることに注意してください」という意味を完全には明確にしていません。 –

14

クエリで二回、単一のテーブルを使用しますそのような2つの名前を付けることによって。

エイリアスは、しばしばキーワードASとともに導入されます。また、通常は結合条件を指定します(それがなければ、テーブルのCartesian Productを結合します)。あなたが明示的なJOIN表記法を使用することを好みます。

SELECT c1.id AS sender, c2.id AS replier 
    FROM contacts AS c1 
    JOIN contacts AS c2 ON c1.xxx = c2.yyy; 

この例では、どの列が結合に使用されるかはわかりません。私たちはそれを解決するための情報を持っていません。

通常、このようなメッセージテーブルとして、仲介者として機能するように別のテーブルがあると思います:

SELECT c1.id AS sender, c1.email AS sender_email, 
     c2.id AS replier, c2.email AS replier_email, 
     m.date_time 
    FROM messages AS m 
    JOIN contacts AS c1 ON m.sender_id = c1.id 
    JOIN contacts AS c2 ON m.replier_id = c2.id; 
1

として、なるだろうはい、あなたがテーブルに別のエイリアスを与えることによって、二度同じテーブルを使用することができます。私は自己結合について学ぶことがあなたの理解に役立つと思います。

1

はい、同じSELECTクエリ内で同じテーブルを複数回使用できます。

テーブルが同じスコープ内に複数回現れる場合は、テーブルの相関名(大まかに「エイリアス」)のみを使用する必要があることに注意してください。それぞれが異なるスコープ(各UNIONキーワードによって分離さ)の範囲内であるので、例えば、以下SELECTクエリは、二度同じテーブルを使用するが、いかなるテーブル相関名が必要とされない:

SELECT id, 'Sender' AS contact_narrative 
    FROM contacts 
WHERE something = 1 
UNION 
SELECT id, 'Replier' AS contact_narrative 
    FROM contacts 
WHERE something = 2; 
関連する問題