【问题标题】:mysql: left join but select one particular item from the joined tablemysql:左连接但从连接表中选择一个特定项目
【发布时间】:2011-05-17 07:05:35
【问题描述】:

例如,我只需要从两个对应的表中选择一行,

成员表,

member_id   member_name
1           xxx
2           yyy

profile_picture 表

image_id   member_id   image_approved
1          1           no
2          1           no
3          1           yes

我想每次从成员表中选择一行,并从 profile_picture 中选择一张批准的图像。我正在使用左连接,但它不能正常工作,因为当该成员有超过 1 个上传的图像时,它会复制所选成员。棘手的部分是我只想选择已批准的图像,并且总是一张图片将被批准。

SELECT *
    FROM member 

    LEFT JOIN profile_picture 
    ON profile_picture.member_id = member.member_id

    WHERE member.member_id = '1'

我想把它作为输出,

member_id   member_name image_id image_approved
1           xxx         3        yes

有可能吗?

谢谢。

编辑:

感谢大家的建议。许多人建议使用 AND - 例如,AND profile_picture.image_approved = 'yes'

它仅在图像存在时才有效。但是如果图像不存在,则输出中没有任何内容,即使如果图像不存在,它应该像下面这样输出。

member_id   member_name image_id image_approved
1           xxx         null      null

再次感谢!

【问题讨论】:

    标签: sql select mysql left-join


    【解决方案1】:
    select
      *
    from
      member m
      left join profile_picture p on p.member_id = m.member_id
    where
      m.member_id = '1'
      and (p.image_approved is null or p.image_approved = 'yes')
    

    image_approved 不是连接条件的一部分,所以我没有把它放在join 子句中。它是行选择条件的一部分,所以它进入where。考虑一下您想要什么,您要么在 profile_picture 中什么都不想要,要么在批准的行中不想要。所以,条件。

    【讨论】:

    • mp 是表别名。 as 关键字是可选且隐含的,因此member 别名为mprofile_picture 别名为p
    【解决方案2】:

    image_approved条件添加到您的查询中可以为您提供给定输入所需的输出。

    SELECT *
        FROM member 
    
        LEFT OUTER JOIN profile_picture 
        ON profile_picture.member_id = member.member_id
    
        WHERE member.member_id = '1'
              AND image_approved = 'yes'
    

    【讨论】:

      【解决方案3】:

      你的意思是:

      SELECT * 
          FROM member  
          LEFT JOIN profile_picture  
          ON profile_picture.member_id = member.member_id 
          WHERE member.member_id = '1' 
          AND profile_picture.image_approved = 'yes'
      

      【讨论】:

        【解决方案4】:

        您不需要在适合使用INNER JOIN 的地方使用LEFT JOIN。你需要一个关于profile_picture 的专栏,对吧?您似乎只需要一个额外的WHERE 条件:

        SELECT
           *
        FROM
           member
           JOIN profile_picture USING (member_id)
        WHERE
           member_id = 1
           AND image_approved = 'yes'
        

        是否有可能在右表上有不止一列,而您只想得到一列?您想要最后批准的图像吗?添加这些:

        GROUP BY
           member_id
        ORDER BY
           image_id
        

        【讨论】:

        • 结果将不包括有 0 张图片的成员。
        • 从他的问题来看,情况并非如此,但这很容易解决。只需将 JOIN 更改为 LEFT JOIN 并将 image_approved 条件放在 ON 子句中(目前是 USING 子句)
        【解决方案5】:

        要么按照 Donnie 的建议在 WHERE 子句中容纳 NULL,要么使用表表达式来限制您的第二个表,如下所示:

        Select member.member_id, member_name, image_id, image_approved
        From member LEFT Outer Join
             ( Select image_id, member_id, image_approved
               From profile_picture
               Where image_approved = 'yes' ) Images
                  on Images.member_id = member.member_id
        

        【讨论】:

          猜你喜欢
          • 2018-03-30
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 1970-01-01
          • 2020-12-07
          • 1970-01-01
          • 2015-07-17
          相关资源
          最近更新 更多