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 以确保返回单行的主要内容,如果未能解决你的问题,请参考以下文章
Linq-to-Entities:带有 WHERE 子句和投影的 LEFT OUTER JOIN
mysql where not in to left outer join