【问题标题】:sql query using left joins and where clause使用左连接和 where 子句的 sql 查询
【发布时间】:2014-02-27 17:56:41
【问题描述】:

我有以下问题

SELECT *
  FROM tbl_events AS event
       LEFT JOIN tbl_business_events AS bevent 
                 ON event.event_id = bevent.event_id 
       LEFT JOIN tbl_business_sector AS bsec 
                 ON event.event_id = bsec.event_id 
       LEFT JOIN tbl_sectors AS sector 
                 ON bsec.sector_id = sector.sector_id 
       LEFT JOIN tbl_event_location AS eloc 
                 ON event.event_id = eloc.event_id 
       LEFT JOIN tbl_locations AS location 
                 ON location.location_id = eloc.location_id 
 WHERE event.event_type = 1

我用它来提取我的事件列表的所有详细信息,这可行,但我现在想从另一个表 tbl_event_images 中提取事件资料图片。此表存储所有事件图像,但有一个名为 is_profile_picture 的字段,用于确定它是否是个人资料图片(值为 0 表示不是,如果图像是个人资料图片则为 1)

所以我尝试使用以下查询来获取事件资料图片以及使用以下查询的其余信息

SELECT *
  FROM tbl_events AS event
       LEFT JOIN tbl_event_images AS eIMG 
                 ON event.event_id = eIMG.event_id
       LEFT JOIN tbl_business_events AS bevent 
                 ON event.event_id = bevent.event_id
       LEFT JOIN tbl_business_sector AS bsec 
                 ON event.event_id = bsec.event_id
       LEFT JOIN tbl_sectors AS sector 
                 ON bsec.sector_id = sector.sector_id
       LEFT JOIN tbl_event_location AS eloc 
                 ON event.event_id = eloc.event_id
       LEFT JOIN tbl_locations AS location 
                 ON location.location_id = eloc.location_id
 WHERE event.event_type =1

但此查询会为该表中事件的每张照片返回一个新行。

然后我尝试在上面添加另一个 where 子句 AND eIMG.is_profile_picture =1

但由于并非每个列表都有照片,更不用说头像了,所以上面的查询只返回有头像的事件。

无论他们是否有个人资料图片,我如何为每个事件返回 1 行?如果他们这样做了,那么它将添加图像的名称,如果它没有将其设置为 NULL

谢谢 卢克

【问题讨论】:

  • 澄清一下:1)eIMG 是包含图片的表格,2)不是所有的事件都有图片吗?如果要连接的表可能不包含与连接匹配的行,则需要改用 OUTER 连接。
  • @Alex 左连接是外连接。
  • @GoatCO 抱歉 - 我倾向于明确指定内部与外部,所以我偏离了轨道。

标签: mysql sql select left-join


【解决方案1】:

不要使用WHERE 条件,而是将is_profile_picture 条件添加到您的JOIN 条件中:

SELECT *
FROM tbl_events AS event
LEFT JOIN tbl_event_images AS eIMG 
   ON   event.event_id = eIMG.event_id 
    AND eIMG.is_profile_picture =1
LEFT JOIN tbl_business_events AS bevent 
   ON event.event_id = bevent.event_id
LEFT JOIN tbl_business_sector AS bsec 
   ON event.event_id = bsec.event_id
LEFT JOIN tbl_sectors AS sector 
   ON bsec.sector_id = sector.sector_id
LEFT JOIN tbl_event_location AS eloc 
   ON event.event_id = eloc.event_id
LEFT JOIN tbl_locations AS location 
   ON location.location_id = eloc.location_id
WHERE event.event_type =1

WHERE 过滤所有结果,在这种情况下有效地否定了您对LEFT JOIN 的使用。添加到JOIN 条件本身意味着只有一些图片会加入,但仍然会返回原始查询的所有结果。

【讨论】:

    【解决方案2】:

    试试这个

    SELECT *
    FROM tbl_events AS event
    LEFT JOIN tbl_event_images AS eIMG ( ON event.event_id = eIMG.event_id AND  eIMG.is_profile_picture = 1 )
    LEFT JOIN tbl_business_events AS bevent ON event.event_id = bevent.event_id
    LEFT JOIN tbl_business_sector AS bsec ON event.event_id = bsec.event_id
    LEFT JOIN tbl_sectors AS sector ON bsec.sector_id = sector.sector_id
    LEFT JOIN tbl_event_location AS eloc ON event.event_id = eloc.event_id
    LEFT JOIN tbl_locations AS location ON location.location_id = eloc.location_id
    WHERE event.event_type =1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2015-08-01
      相关资源
      最近更新 更多