2009-09-08 24 views
24

Üç tablom var.mysql içinde nerede ve iç birleştirme kullanarak

yerleri

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

okullar İşte

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

tablo loc

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

school_locations Ations, uygulamanın tüm konumlarını içerir. Okul için yerler ID'ler tarafından çağrılır.

i sorgu kullandığınızda

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

o tip "ülkeleri"

ile adlarını görüntüler Ama sadece school_locations type = "coun" sahip olduğu locations.name görüntülemek istediğiniz

i sorguları yapmak istedim, ama hiçbiri

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; 

veçalışıyor görünüyor

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"; 
o iç sorguları katılır birden kullanmak mümkündür, ya da başka bir yol var?

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" 

Okula ardından School_Locations için Yerler ve School_Locations katılabilirsiniz:

cevap

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'; 

WHERE fıkra bu deneyin deyimi

+0

backticks mSQL ihtiyaç vardır? –

+2

hayır, ama ben onları orada gibi istiyorum, garip tablo veya sütun adları (örneğin, select, count, a% b, vb) ile sorunları önler ve daha kusursuz – knittl

+4

Ayrıca, ne yazık ki, ANSI uyumlu olmayan sorgu yapar Sorguyu başka bir veritabanına geçirmeyi denerseniz, sorunlara neden olabilir. Tanımlayıcıları sınırlamanın uygun yolu "çift tırnak" ile yapılır, ancak MySQL bunu varsayılan olarak desteklemez; Bunu elde etmek için SQL_MODE'de ANSI_QUOTES ayarlamalısınız. Tabii ki daha sonra, SQL_MODE 'un bağımsız olarak tek tırnak işareti ile yazılması gereken dizginizdeki "coun" kelimesini karıştırır. – bobince

2

sonunda olmak zorunda. Bu, ilgili Mekanlar ve Okulların bir setini oluşturur ve daha sonra WHERE maddesini kullanarak, konumu "coun" türüne sahip olan kişilere başvurabilirsiniz.

0

İstediğiniz kadar, ancak, daha sen

+2

, kendi sorusuna cevap vermiyor – knittl

+1

Farklı davranmaya çalışıyorum, sorunun son cümlesine bakın. Tabii ki bütün soruya cevap vermedim, ama diğer cevaplardan birinin bunu karşıladığını hissettim. – baldy

+1

Ama sonra stackoverflow görgü kurallarına göre bu belirli cevaba bir yorum olmalı. Anlayışın için teşekkürler. –

1

bu deneyin performans etkileyecek daha kullanmak birleşimler kullanabilirsiniz:

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'; 
İlgili konular