【问题标题】:using where and inner join in mysql在mysql中使用where和inner join
【发布时间】:2010-11-26 10:07:31
【问题描述】:

我有三张桌子。

位置

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

学校

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

学校位置

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

这里的位置表包含应用程序的所有位置。学校的位置由 ID 调用。

当我使用查询时

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

它显示类型为“coun”的名称

但我想显示只有 school_locations 有 type="coun" 的位置.name

我尝试了以下查询,但似乎没有一个有效

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

是否可以在查询中使用多个内连接,或者有其他方法吗?

【问题讨论】:

    标签: mysql inner-join


    【解决方案1】:
        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 子句必须在语句的末尾

    【讨论】:

    • msql 中需要反引号吗?
    • 不,但我喜欢把它们放在那里,它避免了奇怪的表或列名(例如 select、count、a%b 等)的问题,并且更安全
    • 不幸的是,它还会使查询不符合 ANSI,如果您尝试将查询迁移到另一个数据库,可能会导致问题。分隔标识符的正确方法是使用“双引号”,但默认情况下 MySQL 不支持;你必须在 SQL_MODE 中设置 ANSI_QUOTES 才能得到它。当然,这会弄乱您的字符串文字“coun”,无论 SQL_MODE 是什么,都应该用单引号编写。
    • 有趣,不知道反引号和引号(我只使用 mysql)。嗯,关于字符串的单引号是对的(提问者代码中的复制粘贴错误)
    • 天啊,我被困在 WHERE 声明之前 INNER JOIN。我使用了常规的单引号。
    【解决方案2】:

    试试这个:

    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"
    

    您可以将 Locations 加入 School_Locations,然后将 School_Locations 加入学校。这形成了一组所有相关的位置和学校,然后您可以使用 WHERE 子句将它们向下移动到位置类型为“coun”的那些。

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        【解决方案4】:

        您可以根据需要使用任意数量的连接,但是使用的越多,它对性能的影响就越大

        【讨论】:

        • 没有回答他的问题
        • 我不同意,请参阅问题的最后一句话。当然我没有回答整个问题,但我觉得其他答案之一涵盖了这一点。
        • 但是根据 stackoverflow 礼仪,这应该是对该特定答案的评论。感谢理解。
        猜你喜欢
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        相关资源
        最近更新 更多