MySQL'de aynı masaya iki kez nasıl katılırsınız?


110

2 masam var. Birinin (alan adları) alan kimlikleri ve alan adları (dom_id, dom_url) vardır.

diğeri gerçek verileri içerir, bunlardan 2'si TO ve FROM alan adları gerektirir. Dolayısıyla, her ikisi de etki alanları tablosundan etki alanı adı kimliğini depolayan rev_dom_from ve rev_dom_for 2 sütunum var.

Basit.

Şimdi web sayfasında her iki alan adını da görüntülemem gerekiyor. Reviews.rev_dom_for = domains.dom_url sorgusundaki LEFT JOIN domains üzerinden birini veya diğerini nasıl görüntüleyeceğimi biliyorum ve sonra rev_dom_for sütunundaki alan adını yansıtan dom_url'yi yankılanırsınız.

Fakat dom_rev_from sütunundaki 2. alan adını nasıl yansıtabilirim?

mysql 

Yanıtlar:


166

şu satırlarda başka bir birleşim kullanırsınız:

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

DÜZENLE :

Tek yaptığınız masaya birden çok kez katılmak. Gönderideki sorguya bakın: İncelemeler tablolarından değerleri seçer (rvw olarak adlandırılır), bu tablo size Etki Alanı tablosuna 2 referans sağlar (bir FOR ve bir FROM).

Bu noktada, Etki Alanı tablosuna Yorumlar tablosuna katılmak basit bir konudur. FOR için bir kez (toD olarak takma ad) ve FROM için ikinci kez (fromD olarak takma ad).

Ardından, SEÇİM listesinde, DOMAIN tablosunun her iki SOL BİRLEŞTİRİLMESİNDEN DOM_URL alanlarını seçip, Alanlar tablosuna referans olarak birleştirilen her biri için tablo takma adına başvurur ve bunları ToURL ve FromUrl olarak adlandırırsınız.

SQL'de diğer adlandırma hakkında daha fazla bilgi için burayı okuyun .


5
İşin püf noktası, her bir JOIN'i "AS to" ve "AS from" adlarıyla tanımlamış olmanızdır, böylece bunları SELECT'te kullanabilirsiniz.
Matthew Smith

1
tablo adı için olmayan bir anahtar kelime kullanmak açıklığa kavuşacaktır. ayrıca, takma ad verirken "as" anahtar sözcüğünü kullanın.
TheSoftwareJedi

Bağışla beni, ama bunun nasıl olması gerektiğini hala anlamıyorum. 2 tablo şunlardır: alanlar (dom_id, dom_url) ve incelemeler (rev_id, rev_dom_from, rev_dom_for). Eğer birisi tam sorguyu yazabilseydi, böylece onu anlayabilirim, bu harika olurdu, çünkü neyi düzenlemem gerektiğine dair hiçbir fikrim yok.

1
Takma adları tablonun kendisine değil, tablodaki satırlara başvuran olarak düşünün. Benzetme yaparsak, "for (i = 0; i <max; i ++)" gibi bir döngüde i değişkeni yinelenen bir değerdir, döngünün kendisi değildir.
Bill Karwin

Bunu SQL'de yapabileceğini bilmiyordum, Gracias.
Adam F

8

Aşağıdaki tablolara göre ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Bu sql'yi deneyin ... (Stephen Wrighton'ın yukarıda yazdığı şey hemen hemen aynıdır) İşin püf noktası, temelde aynı sorguda iki kez etki alanı tablosundan seçim yapıp sonuçlara katılmanızdır.

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

Hâlâ takılıp kalırsanız, lütfen tam olarak anlamadığınız konusunda daha spesifik olun.


-1

Bunu okuyun ve deneyin, bu size yardımcı olacaktır:

Tablo 1

column11,column12,column13,column14

Tablo 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 ile eşleşen bir tablo 2 örneğidir table1.column11=table2asnew1.column21

ve

table2asnew2 ile eşleşen başka bir tablo 2 örneğidir table1.column12=table2asnew2.column22

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.