在mysql中使用where和inner join

Posted

技术标签:

【中文标题】在mysql中使用where和inner join【英文标题】:using where and inner join in mysql 【发布时间】: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";

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

【问题讨论】:

【参考方案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】:

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

【讨论】:

没有回答他的问题 我不同意,请参阅问题的最后一句话。当然我没有回答整个问题,但我觉得其他答案之一涵盖了这一点。 但是根据 *** 礼仪,这应该是对该特定答案的评论。感谢理解。

以上是关于在mysql中使用where和inner join的主要内容,如果未能解决你的问题,请参考以下文章

带有 WHERE 子句和 INNER JOIN 的 MySQL 更新查询不起作用

Mysql Inner join,Where,Between 在多个表中

在 SQL ACCESS 中使用 LEFT 或 INNER JOIN 和 WHERE 的问题

MySQL Inner Join 有限制吗?

Oracle中Inner join和Where的区别

最全解释Mysql 的join中on与where 过滤条件差异