Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySql. Cách sử dụng Tự tham gia

Bạn thật gần!

Vì bạn nói rằng bạn đang hiển thị quốc gia và năm từ A và giới hạn bởi A. Country của Thổ Nhĩ Kỳ, Thổ Nhĩ Kỳ là tất cả những gì bạn sẽ thấy. Bạn cần thay đổi các lựa chọn thành B.countryB.year hoặc thay đổi mệnh đề where thành B.country .

Điều này đang sử dụng kết hợp chéo sẽ làm chậm hơn khi có nhiều bản ghi hơn trong một bảng.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

có thể được viết là ... và có thể có cùng một kế hoạch thực hiện.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

ORThis sử dụng INNER JOIN giới hạn công việc mà engine phải thực hiện và không bị suy giảm hiệu suất mà một kết nối chéo sẽ làm.

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';

TẠI SAO:

Xem xét công cụ SQL sẽ làm gì khi kết nối xảy raA B

+------------+------+--------+------------+------+--------+
| A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 

Vì vậy, khi bạn nói hiển thị A.CountryA.Year ở đâu A.Country là Thổ Nhĩ Kỳ, bạn có thể thấy tất cả những gì nó có thể trả lại là Thổ Nhĩ Kỳ (do chỉ có 1 bản ghi riêng biệt)

Nhưng nếu bạn làm B.Country là Thổ Nhĩ Kỳ và hiển thị A.Country , bạn sẽ đến Pháp, Canada và Thổ Nhĩ Kỳ!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cú pháp MYSQL không đánh giá không bằng với NULL

  2. Tôi cần lấy danh sách những người dùng đã được gửi tin nhắn trước đó (MySQL)

  3. Mysql Đếm các hàng liên tiếp phù hợp

  4. Chọn tất cả các trường ngoại trừ chỉ một trường trong mysql

  5. Làm thế nào để chạy các truy vấn SQL gốc trong cùng một giao dịch Hibernate?