どのようにmysqlで同じテーブルに2回参加しますか?


110

2つのテーブルがあります。1つ(ドメイン)には、ドメインIDとドメイン名(dom_id、dom_url)があります。

もう1つは実際のデータを含み、そのうち2つの列にはTOおよびFROMドメイン名が必要です。したがって、ドメインテーブルの2つの列rev_dom_fromとrev_dom_forがあり、どちらにもドメイン名IDが格納されています。

シンプル。

次に、実際に両方のドメイン名をWebページに表示する必要があります。LEFT JOINドメインON review.rev_dom_for = domains.dom_urlクエリを使用して、どちらかを表示する方法を知っています。次に、dom_urlをエコーし​​ます。これにより、rev_dom_for列のドメイン名がエコーされます。

しかし、dom_rev_from列の2番目のドメイン名をエコー出力するにはどうすればよいですか?

mysql 

回答:


166

次のように、別の結合を使用します。

SELECT toD.dom_url AS ToURL, 
    fromD.dom_url AS FromUrl, 
    rvw.*

FROM reviews AS rvw

LEFT JOIN domain AS toD 
    ON toD.Dom_ID = rvw.rev_dom_for

LEFT JOIN domain AS fromD 
    ON fromD.Dom_ID = rvw.rev_dom_from

編集

テーブルに複数回参加するだけです。投稿のクエリを見てください。レビューテーブル(別名rvw)から値を選択し、そのテーブルからドメインテーブルへの2つの参照(FORおよびFROM)が提供されます。

この時点で、ドメインテーブルをレビューテーブルに左結合することは簡単です。FORに対して1回(別名toD)、FROMに対して2回目(別名fromD)。

次に、SELECTリストで、DOMAINテーブルの両方のLEFT JOINSからDOM_URLフィールドを選択し、Domainsテーブルへの参照で結合されたそれぞれのテーブルエイリアスによってそれらを参照し、ToURLおよびFromUrlとしてエイリアスします。

SQLのエイリアスの詳細については、こちらをご覧ください


5
トリックは、各JOINを「AS to」と「AS from」という名前で識別して、SELECTで使用できるようにすることです。
マシュースミス

1
テーブル名に非キーワードを使用すると明確になります。さらに、エイリアスするときは、「as」キーワードを使用します。
TheSoftwareJedi 2008年

私を許してください、しかし私はまだこれがどのように機能することになっているのか理解していません。2つのテーブルは、ドメイン(dom_id、dom_url)、およびレビュー(rev_id、rev_dom_from、rev_dom_for)です。誰かが正確なクエリを書くことができるようになり、私がそれのコツをつかむことができれば、私は何を編集しなければならないのかわからないので、それは素晴らしいでしょう。

1
エイリアスは、テーブル自体ではなく、テーブルの行を参照していると考えてください。同様に、「for(i = 0; i <max; i ++)」のようなループでは、変数iは反復値であり、ループ自体ではありません。
ビルカーウィン、

SQLでこれができるとは知りませんでした、グラシアス。
アダムF

8

次の表が与えられます。

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

このsqlを試してみてください...(Stephen Wrightonが上で書いたものとほとんど同じです)トリックは、基本的に同じクエリでドメインテーブルから2回選択し、結果を結合することです。

Select d1.dom_url, d2.dom_id from
review r, domain d1, domain d2
where d1.dom_id = r.rev_dom_from
and d2.dom_id = r.rev_dom_for

それでも行き詰まっている場合は、正確に理解できないということを具体的に説明してください。


-1

これを読んで試してみてください、これはあなたを助けるでしょう:

表1

column11,column12,column13,column14

表2

column21,column22,column23,column24


SELECT table1.column11,table1.column12,table2asnew1.column21,table2asnew2.column21 
FROM table1 INNER JOIN table2 AS table2asnew1 ON table1.column11=table2asnew1.column21  INNER TABLE table2 as table2asnew2 ON table1.column12=table2asnew2.column22

table2asnew1 一致するテーブル2のインスタンスです。 table1.column11=table2asnew1.column21

そして

table2asnew2 一致するテーブル2の別のインスタンスです table1.column12=table2asnew2.column22

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.