Làm thế nào để bạn tham gia vào cùng một bàn, hai lần, trong mysql?


110

Tôi có 2 bảng. Một (miền) có id miền và tên miền (dom_id, dom_url).

cột còn lại chứa dữ liệu thực tế, trong đó 2 cột yêu cầu tên miền ĐẾN và TỪ. Vì vậy, tôi có 2 cột rev_dom_from và rev_dom_for, cả hai đều lưu trữ id tên miền, từ bảng miền.

Đơn giản.

Bây giờ tôi cần thực sự hiển thị cả hai tên miền trên trang web. Tôi biết cách hiển thị cái này hoặc cái kia, thông qua các miền LEFT THAM GIA TRÊN truy vấn reviews.rev_dom_for = domains.dom_url và sau đó bạn lặp lại dom_url, điều này sẽ lặp lại tên miền trong cột rev_dom_for.

Nhưng làm cách nào để làm cho nó vang lên tên miền thứ 2, trong cột dom_rev_from?

mysql 

Câu trả lời:


166

bạn sẽ sử dụng một phép nối khác, một cái gì đó dọc theo những dòng sau:

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

CHỈNH SỬA :

Tất cả những gì bạn đang làm là tham gia vào bảng nhiều lần. Nhìn vào truy vấn trong bài đăng: nó chọn các giá trị từ bảng Nhận xét (bí danh là rvw), bảng đó cung cấp cho bạn 2 tham chiếu đến bảng Miền (một FOR và một TỪ).

Tại thời điểm này, việc rời khỏi bảng Tên miền để chuyển sang bảng Đánh giá là một vấn đề đơn giản. Một lần (bí danh là toD) cho FOR, và lần thứ hai (bí danh là fromD) cho FROM.

Sau đó, trong danh sách CHỌN, bạn sẽ chọn các trường DOM_URL từ cả hai trường THAM GIA TRÁI của bảng DOMAIN, tham chiếu chúng bằng bí danh bảng cho mỗi trường được tham chiếu đến bảng Tên miền và đặt bí danh chúng là ToURL và FromUrl.

Để biết thêm thông tin về bí danh trong SQL, hãy đọc tại đây .


5
mẹo là bạn đã xác định mỗi THAM GIA với tên 'AS đến' và 'AS từ' để bạn có thể sử dụng chúng trong phần CHỌN.
Matthew Smith,

1
sử dụng một từ khóa không phải cho một tên bảng sẽ làm rõ. ngoài ra, hãy sử dụng từ khóa "as" khi làm răng cưa.
TheSoftwareJedi 14/10/08

Thứ lỗi cho tôi, nhưng tôi vẫn không hiểu nó sẽ hoạt động như thế nào. Hai bảng là: tên miền (dom_id, dom_url) và đánh giá (rev_id, rev_dom_from, rev_dom_for). Nếu ai đó có thể viết câu truy vấn chính xác để tôi hiểu được nó, điều đó thật tuyệt, vì tôi không biết mình phải chỉnh sửa gì.

1
Hãy coi các bí danh như các hàng tham chiếu trong bảng, không phải bản thân bảng. Tương tự, trong một vòng lặp như "for (i = 0; i <max; i ++)", biến i là một giá trị lặp, bản thân nó không phải là vòng lặp.
Bill Karwin 14/10/08

Tôi không biết bạn có thể làm điều này trong SQL, Gracias.
Adam F

8

Cho các bảng sau ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Hãy thử sql này ... (Nó khá giống với điều mà Stephen Wrighton đã viết ở trên) Bí quyết là về cơ bản bạn đang chọn từ bảng miền hai lần trong cùng một truy vấn và kết hợp các kết quả.

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

Nếu bạn vẫn còn vướng mắc, vui lòng nói rõ hơn với chính xác là bạn chưa hiểu.


-1

Đọc và thử, điều này sẽ giúp bạn:

Bảng 1

column11,column12,column13,column14

Ban 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 là một ví dụ của bảng 2 được so khớp bởi table1.column11=table2asnew1.column21

table2asnew2 là một ví dụ khác của bảng 2 được so khớp bởi table1.column12=table2asnew2.column22

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.