mysql left join to table with multiple rows on min id 以确保返回单行

Posted

技术标签:

【中文标题】mysql left join to table with multiple rows on min id 以确保返回单行【英文标题】:mysql left join to table with multiple rows on min id to ensure single row returned 【发布时间】:2015-10-05 17:39:48 【问题描述】:
item
id=1..
id=2..
id=3..

item_image
id=1, item_id=1, image_id=1
id=2, item_id=2, image_id=2
id=3, item_id=2, image_id=3

image
id=1
id=2
id=3

使用以下 SQL,我得到了 itemid 2 的重复记录。一个具有 image_id=2,另一个具有 image_id= null。

 SELECT  i.id iid, im.id, i.summary, i.description, ist.name , item_status, i.enabled, p.price_asked_for, im.thumb_url
 FROM item i
 LEFT JOIN item_status ist
 ON ist.id = i.item_status_id
 LEFT JOIN price p
 ON p.id = i.price_id
 LEFT OUTER JOIN item_image ii
 ON i.id = ii.item_id
 LEFT OUTER JOIN image im
 ON im.id = ii.image_id
 WHERE i.member_id = 436
  and (im.id =  ( select min(ii2.image_id) from item_image ii2 where      ii.item_id = ii2.item_id) 
    or im.id is null)

item_image 可能有也可能没有匹配的行。 图像表可能有超过 1 个匹配行。

我正在尝试返回图像表中的第一个匹配项(如果存在),但如果不存在则返回 null。

如果存在“or im.id is null”行,我可以确保如果没有匹配的图像,则可以不返回任何内容。如果我没有这个并且没有图像,则记录不会出现,因为没有图像。 但是,有了这个或 null 我得到了一个匹配的图像和一个空值。重复。 有没有更好的方法来处理这个问题?

【问题讨论】:

【参考方案1】:

评论太长了。

表达式:

(im.id =  (select min(ii2.image_id)
           from item_image ii2
           where ii.item_id = ii2.item_id)  or
 im.id is null)

不能负责返回重复。两个表达式中最多有一个可以为真。为什么?因为如果im.id 为NULL,那么第一个总是会失败(与NULL 的比较不正确)。如果im.id 不是 NULL,那么第二个失败。

【讨论】:

以上是关于mysql left join to table with multiple rows on min id 以确保返回单行的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL Left Join 如何选择 NULL 值?

Linq-to-Entities:带有 WHERE 子句和投影的 LEFT OUTER JOIN

mysql where not in to left outer join

MySQL中的LEFT JOIN 和UNIONALL的联合使用

mysql的表连接( left | right )join

MySQL left join操作中 on与where放置条件的区别