2009-09-08 42 views
24

Tôi có ba bảng.sử dụng nơi và tham gia bên trong trong mysql

địa điểm

ID | NAME | TYPE | 
1 | add1 | stat | 
2 | add2 | coun | 
3 | add3 | coun | 
4 | add4 | coun | 
5 | add5 | stat | 

trường

ID | NAME 
1 | sch1  
2 | sch2 
3 |sch3 

school_locations

ID |LOCATIONS_ID |SCHOOL_ID 
1 | 1   |1 
2 | 2   |2 
3 | 3   |3 

Dưới đây bảng loc hành tây chứa tất cả các vị trí của ứng dụng.Locations cho trường được gọi bằng ID.

khi tôi sử dụng truy vấn

select locations.name from locations where type="coun"; 

nó sẽ hiển thị tên với loại "nước có tỷ lệ"

Nhưng tôi muốn hiển thị locations.name nơi chỉ school_locations có type = "coun"

i đã thử các truy vấn sau đây, nhưng dường như không có hoạt động nào

select locations.name 
from locations 
where type="coun" 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id; 

select locations.name 
from locations 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id where type="coun"; 

có thể sử dụng nhiều kết nối bên trong trong truy vấn hoặc có cách nào khác không?

Trả lời

45
SELECT `locations`.`name` 
     FROM `locations` 
INNER JOIN `school_locations` 
     ON `locations`.`id` = `school_locations`.`location_id` 
INNER JOIN `schools` 
     ON `school_locations`.`school_id` = `schools_id` 
    WHERE `type` = 'coun'; 

mệnh đề WHERE phải là ở phần cuối của báo cáo kết quả

+0

được backticks cần thiết trong msql? –

+2

không, nhưng tôi thích có chúng ở đó, nó tránh được các vấn đề với các tên bảng hoặc cột lạ (ví dụ như chọn, đếm, a% b, v.v.) và cũng dễ hiểu hơn – knittl

+4

Thật không may, làm cho truy vấn không tuân thủ ANSI , có khả năng gây ra vấn đề nếu bạn cố di chuyển truy vấn đến cơ sở dữ liệu khác. Cách đúng đắn của việc phân định các định danh là với "doublequotes", nhưng MySQL không hỗ trợ điều này theo mặc định; bạn phải đặt ANSI_QUOTES trong SQL_MODE để nhận được điều đó. Tất nhiên sau đó messes lên chuỗi chữ "coun" của bạn, mà nên bất kể SQL_MODE được viết với dấu nháy đơn. – bobince

2

Hãy thử điều này:

SELECT Locations.Name, Schools.Name 
FROM Locations 
INNER JOIN School_Locations ON School_Locations.Locations_Id = Locations.Id 
INNER JOIN Schools ON School.Id = Schools_Locations.School_Id 
WHERE Locations.Type = "coun" 

Bạn có thể tham gia Locations để School_Locations và sau đó School_Locations đến trường. Điều này tạo thành một tập hợp tất cả các vị trí và trường học liên quan, sau đó bạn có thể viết xuống bằng mệnh đề WHERE cho những người có Vị trí thuộc loại "danh từ".

0

Bạn có thể sử dụng bao nhiêu tham gia như bạn muốn, tuy nhiên, càng có nhiều bạn sử dụng nhiều nó sẽ ảnh hưởng đến hiệu suất

+2

không trả lời câu hỏi của mình – knittl

+1

Tôi cầu xin sự khác biệt, xem câu cuối cùng trong câu hỏi. Chắc chắn tôi đã không trả lời toàn bộ câu hỏi, nhưng tôi cảm thấy rằng một trong những câu trả lời khác đã đề cập đến điều đó. – baldy

+1

Nhưng sau đó theo nghi thức stackoverflow này nên là một bình luận cho câu trả lời cụ thể đó. Cảm ơn vì đã hiểu. –

1

Hãy thử điều này:

SELECT 
    (
     SELECT 
      `NAME` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) as `NAME` 
FROM 
    school_locations 
WHERE 
    (
     SELECT 
      `TYPE` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) = 'coun'; 
Các vấn đề liên quan