33

I have three tables.

locations

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

schools

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

school_locations

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

Here the table locations contains all the locations of the application.Locations for school are called by ID's.

when i use the query

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

it displays names with type "coun"

But I want to display locations.name where only school_locations have type="coun"

i tried following queries, but none seems to be working

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;

and

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

is it possible to use multiple inner joins in queries, or is there another way?

4 Answers 4

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

the WHERE clause has to be at the end of the statement

Sign up to request clarification or add additional context in comments.

6 Comments

are the backticks needed in msql?
no, but i like having them there, it avoids problems with strange table or column names (e.g. select, count, a%b, etc.) and is more foolproof
It also, unfortunately, makes the query non-ANSI-compliant, potentially causing problems if you try to migrate the query to another database. The proper way of delimiting identifiers is with "doublequotes", but MySQL doesn't support this by default; you have to set ANSI_QUOTES in SQL_MODE to get that. Of course that then messes up your string literal "coun", which should regardless of SQL_MODE be written with single quotes.
interesting, didn’t know that about backticks vs. quotation marks (i only work with mysql). and uh, you’re right about single quotes for strings (copy-paste error from the question asker’s code)
Gee, I was stuck putting the WHERE statement before the INNER JOIN. I used regular single quotes.
|
4

Try this:

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"

You can join Locations to School_Locations and then School_Locations to School. This forms a set of all related Locations and Schools, which you can then widdle down using the WHERE clause to those whose Location is of type "coun."

Comments

1

Try this :

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

Comments

-1

You can use as many joins as you want, however, the more you use the more it will impact performance

3 Comments

that doesn’t answer his question
I beg to differ, see the last sentence in the question. Sure I didn't answer the whole question, but I felt that one of the other answers covered that.
But then according to stackoverflow etiquette this should be a comment to that particular answer. Thanks for understanding.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.