【问题标题】:SQL: Help with LEFT OUTER JOINSQL:左外连接帮助
【发布时间】:2009-06-24 19:02:56
【问题描述】:

我的 SQL 似乎没有限制基于 price 的结果。

在我之前的帖子 SQL: Help me optimize my SQL 中,人们表示我应该使用 LEFT OUTER JOIN。

SELECT homes.home_id, 
    address, 
    city, 
    state, 
    zip, 
    price, 
    photo_id, 
    photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND primary_photo_group_id = home_photo_group_id
AND home_photo_type_id =2
AND display_status = true
AND homes.price BETWEEN 500000 AND 1000000

但是,它仍然显示价格为 的房屋

我不明白。当我有一个 WHERE 条件来精确限制该字段时,为什么上面的 SQL 会显示价格低于 500000 的房屋。

感谢您的帮助。

我想做什么

我想根据 X 和 Y 之间的PRICESQFT > Z 等标准同时显示有和没有 home_photo 的房屋。但是这些标准需要同时应用于那些有和那些homes 没有 home_photo

这是正确的吗?

SELECT homes.home_id, 
    address, 
    city, 
    state, 
    zip, 
    price, 
    photo_id, 
    photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
    AND homes.primary_photo_group_id = home_photos.home_photo_group_id
    AND home_photos.home_photo_type_id =2
WHERE homes.display_status = true
AND homes.price BETWEEN 500000 AND 1000000

【问题讨论】:

    标签: sql database database-design query-optimization


    【解决方案1】:

    最后一行应该使用 WHERE not AND

    WHERE homes.price BETWEEN 500000 AND 1000000
    

    最终结果是下面的SQL:

    SELECT 
        homes.home_id, 
        homes.address, 
        homes.city, 
        homes.state, 
        homes.zip, 
        homes.price, 
        home_photos.photo_id, 
        home_photos. photo_url_dir
    FROM 
        homes
        LEFT OUTER JOIN home_photos ON 
            homes.home_id = home_photos.home_id
            AND homes.primary_photo_group_id = home_photos.home_photo_group_id
            AND home_photos.home_photo_type_id =2
    WHERE
        homes.price BETWEEN 500000 AND 1000000
        AND homes.display_status = true
    

    编辑

    现在您的 SQFT 将在 WHERE 之前进行

    AND home_photos.home_photo_type_id =2 
    AND SQFT <=2000 
    WHERE homes.price BETWEEN 500000 AND 1000000
    

    【讨论】:

    • 那么您是说 AND 主...、AND home_photo_type_ID 和 display_status 是 LEFT OUTER JOIN 的一部分,而不是 FROM home 的一部分
    • @SQLMenance,另外,我可以在“WHERE home.price BETWEEN 500000 AND 1000000”之后添加多个“AND”where 子句吗?
    • 对 home_photos 的过滤器(外表)应该在 WHERE 之前,对家(内表)的过滤器应该在 WHERE 之后
    • 您可以在 WHERE 之后添加多个 AND,但通常应该只用于 home 表,否则您将创建内部连接
    • @SQLMenance,我需要的是那些有 home_photo 的房子也符合价格标准,那些没有 home_photo 的房子也符合价格标准。在这种情况下,LEFT JOIN 是否仍然有效?
    【解决方案2】:

    在 JOIN 关键字后使用连接条件,在 WHERE 子句后使用所有其他过滤条件

    【讨论】:

      【解决方案3】:

      试试这个...

      SELECT homes.home_id,     
      address,     
      city,     
      state,     
      zip,     
      price,     
      photo_id,     
      photo_url_dir
      FROM 
      homes
      LEFT OUTER JOIN 
      home_photos ON homes.home_id = home_photos.home_id
      AND 
      primary_photo_group_id = home_photo_group_id
      WHERE 
      home_photo_type_id =2
      AND 
      display_status = true
      AND 
      homes.price BETWEEN 500000 AND 1000000
      

      【讨论】:

      • 如果 Home_photo_type_id 是 home_photos 表的一部分,这是不正确的,因为您实际上是在创建内部连接
      • 这不起作用,因为它不会返回没有设置 primary_photo_group_id 的家庭。它只显示 home 表,不包括 home_photos 表中的家
      【解决方案4】:

      您拥有join 中的所有条件,您应该在where 子句中拥有一些条件以限制查询。比如:

      select
         homes.home_id, 
         address, 
         city, 
         state, 
         zip, 
         price, 
         photo_id, 
         photo_url_dir
      from
         homes
      left join
         home_photos on homes.home_id = home_photos.home_id
      where
         primary_photo_group_id = home_photo_group_id and
         home_photo_type_id = 2 and
         display_status = true and
         homes.price BETWEEN 500000 AND 1000000
      

      由于我不知道每个字段来自哪个表,我不知道上面是否有意义。根据需要在joinwhere 之间划分条件。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 2011-08-23
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 2014-08-03
        相关资源
        最近更新 更多