Soru mysql içinde nerede ve iç birleştirme kullanarak


Üç masam var.

yerleri

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

okullar

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

school_locations

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

Burada masa yerleri uygulamanın tüm yerlerini içerir. Okul için adresler ID'ler tarafından çağrılır.

sorguyu kullandığımda

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

"coun" türüne sahip isimleri görüntüler

Ancak, yalnızca okul_konumlarının type = "coun" olduğu yerlerde location.name görüntülemek istiyorum.

Sorguları denedim ama hiç çalışmıyor

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

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

Sorgularda birden çok iç birleştirme kullanmak mümkün mü yoksa başka bir yol var mı?


25
2017-09-08 07:24


Menşei




Cevaplar:


    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, ifadenin sonunda olmalı


51
2017-09-08 07:28



msql'de gerekli olan backtick'ler nelerdir? - Preet Sangha
hayır, ama onları orada bulundurmayı seviyorum, garip tablo veya sütun isimleriyle (örn. seçme, sayma,% b, vb.) problemleri önler ve daha kusursuzdur - knittl
Ayrıca, ne yazık ki, sorguyu başka bir veritabanına geçirmeyi denerseniz, ANSI uyumlu olmayan, potansiyel olarak sorunlara neden olan sorguyu yapar. 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
ilginç, backticks vs. tırnak işaretleri hakkında bilmiyorum (sadece mysql ile çalışıyorum). ve dizeler için tek tırnak işaretleri konusunda haklısınız (soru sahibinin kodundan kopyala-yapıştır hatası) - knittl
Gee, koyarak sıkışmıştım WHERE önce ifade INNER JOIN. Düzenli tek tırnak kullandım. - megamaiku


Bunu dene:

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"

Konumları, School_Locations'a ve daha sonra School_Locations to School'a katılabilirsiniz. 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.


2
2017-09-08 07:29





Bunu dene :

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

1
2017-08-16 16:39





İstediğiniz kadar çok birleştirici kullanabilirsiniz, ancak, ne kadar çok kullanırsanız performansı etkiler.


0
2017-09-08 07:29



bu onun sorusuna cevap vermiyor - knittl
Farklı olmaya yalvarıyorum, sorudaki son cümleyi görüyorum. Tabii ki bütün soruya cevap vermedim, ama diğer cevaplardan birinin bunu karşıladığını hissettim. - baldy
Ama sonra stackoverflow görgü kurallarına göre bu belirli bir cevaba bir yorum olmalı. Anlayışın için teşekkürler. - Harshay Buradkar