คุณเข้าร่วมโต๊ะเดียวกันสองครั้งใน mysql ได้อย่างไร?


110

ฉันมี 2 โต๊ะ หนึ่ง (โดเมน) มีรหัสโดเมนและชื่อโดเมน (dom_id, dom_url)

อีกอันมีข้อมูลจริงซึ่ง 2 คอลัมน์ต้องการชื่อโดเมน TO และ FROM ดังนั้นฉันจึงมี 2 คอลัมน์ rev_dom_from และ rev_dom_for ซึ่งทั้งสองคอลัมน์เก็บ id ชื่อโดเมนจากตารางโดเมน

เรียบง่าย

ตอนนี้ฉันต้องแสดงชื่อโดเมนทั้งสองจริงบนหน้าเว็บ ฉันรู้วิธีแสดงอย่างใดอย่างหนึ่งผ่านโดเมน LEFT JOIN ในการสอบถาม reviews.rev_dom_for = domains.dom_url จากนั้นคุณก็สะท้อน dom_url ซึ่งจะสะท้อนชื่อโดเมนในคอลัมน์ rev_dom_for

แต่ฉันจะทำให้มันสะท้อนชื่อโดเมนที่ 2 ในคอลัมน์ dom_rev_from ได้อย่างไร

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 รายการ (a FOR และ a FROM)

ณ จุดนี้เป็นเรื่องง่ายที่จะเข้าร่วมตารางโดเมนกับตารางรีวิว หนึ่งครั้ง (นามแฝงเป็น toD) สำหรับ FOR และครั้งที่สอง (นามแฝงจาก D) สำหรับ FROM

จากนั้นในรายการ SELECT คุณจะเลือกช่อง DOM_URL จากทั้ง LEFT JOINS ของตาราง DOMAIN โดยอ้างถึงโดยใช้นามแฝงของตารางสำหรับแต่ละช่องที่เข้าร่วมโดยอ้างอิงถึงตาราง Domains และตั้งชื่อแทนว่า ToURL และ FromUrl

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ aliasing ใน SQL อ่านที่นี่


5
เคล็ดลับคือคุณระบุ JOIN แต่ละรายการด้วยชื่อ 'AS to' และ 'AS from' เพื่อให้คุณสามารถใช้ในการเลือกได้
Matthew Smith

1
การใช้คีย์เวิร์ดที่ไม่ใช่สำหรับชื่อตารางจะทำให้ชัดเจน นอกจากนี้ให้ใช้คำหลัก "เป็น" เมื่อใช้นามแฝง
TheSoftwareJedi

ยกโทษให้ฉัน แต่ฉันยังไม่เข้าใจว่ามันควรจะได้ผลอย่างไร ตาราง 2 ตาราง ได้แก่ โดเมน (dom_id, dom_url) และบทวิจารณ์ (rev_id, rev_dom_from, rev_dom_for) ถ้ามีใครสามารถเขียนข้อความค้นหาที่ถูกต้องได้เพื่อที่ฉันจะได้รับมันก็จะดีมากเพราะฉันไม่รู้ว่าจะต้องแก้ไขอะไร

1
คิดว่านามแฝงอ้างอิงแถวในตารางไม่ใช่ตาราง โดยการเปรียบเทียบในลูปเช่น "for (i = 0; i <max; i ++)" ตัวแปร i คือค่าการวนซ้ำไม่ใช่การวนซ้ำ
Bill Karwin

ฉันไม่รู้ว่าคุณสามารถทำได้ใน SQL, Gracias
Adam F

8

มีตารางดังต่อไปนี้ ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

ลองใช้ sql นี้ ... (ค่อนข้างเหมือนกับที่ Stephen Wrighton เขียนไว้ด้านบน) เคล็ดลับคือโดยทั่วไปคุณจะเลือกจากตารางโดเมนสองครั้งในแบบสอบถามเดียวกันและเข้าร่วมผลลัพธ์

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.