Mysql SQL左连接,结果只有一个

Mysql SQL左连接,结果只有一个,mysql,sql,join,Mysql,Sql,Join,我尝试执行只返回一个结果的左连接。 我有三张桌子 ITEM: ==== some fields ==== ITEM_MEDIA_MAP: item_id: foreign to item media_id: foreign to media featured: boolean MEDIA: ==== some fields ==== 我正在尝试获取项目的所有项目元素和每个缩略图。如果图像被标记为特色,则这是用户手动拾取的缩略图 这是我的SQL查询 SELECT ITEM.title, M

我尝试执行只返回一个结果的左连接。 我有三张桌子

ITEM:
==== some fields ====

ITEM_MEDIA_MAP:
item_id: foreign to item
media_id: foreign to media
featured: boolean

MEDIA:
==== some fields ====
我正在尝试获取项目的所有项目元素和每个缩略图。如果图像被标记为特色,则这是用户手动拾取的缩略图

这是我的SQL查询

SELECT ITEM.title,  MEDIA.* 
FROM "ITEM"
LEFT JOIN (
    select * from ITEM_MEDIA_MAP
    where id in (
        select min(id) from ITEM_MEDIA_MAP group by item_id
    )
    ) as item_id
ON item_id = item.id
LEFT JOIN MEDIA
ON MEDIA.id = media_id
WHERE "ITEM.id" = 1 
ORDER BY ITEM.date ASC
此查询起作用,只从映射表返回一个结果。问题是,我正在获取写入数据库的第一个图像,在数据库中我需要获取标记为features=1的图像,并且只有在我没有这样的图像时才能获取第一个图像

我试过类似的东西

 SELECT ITEM.title,  MEDIA.* 
    FROM "ITEM"
    LEFT JOIN (
        select * from ITEM_MEDIA_MAP
        ORDER BY featured 
        ASC LIMIT 1
        ) as item_id
    ON item_id = item.id
    LEFT JOIN MEDIA
    ON MEDIA.id = media_id
    WHERE "ITEM.id" = 1 
    ORDER BY ITEM.date ASC
但是,当您处理以下问题时,此查询仅从联接返回1个结果:

我需要第一条记录,其中some_字段=some_值,如果没有找到,则返回另一条_记录

我通常会做下一步:

select fields
from (
      select fields, 0 as forder from my_table where first_condition limit 1
      union all
      select fields, 1 as forder from my_table where second_condition limit 1
     )
order by forder
limit 1 
然后,您可以确保返回的记录(如果存在)与所需的条件匹配

你有这个:

select * from ITEM_MEDIA_MAP
    where id in (
        select min(id) from ITEM_MEDIA_MAP group by item_id
    )
但你需要这个:

select * 
from ITEM_MEDIA_MAP
order by featured desc, id
limit 0, 1

这将返回一行(最多),如果特征项存在,它将返回具有最小
id
featured
项。如果它不存在,那么它将返回具有最小
id
的项。此外,您可能不想选择*,而只想选择优化查询所需的列。

您可以合并这两个选项。 这样,您将有2个select语句,但每个项目行都没有子select语句,如下所示:

/* All items which have featured=1 row, join with that row */
SELECT item.* , media.* 
from ITEMS item JOIN ITEM_MEDIA_MAP item_data ON item.id = item_data.item_id and item_data.featured = 1 JOIN MEDIA med ON med.id = item_data.media_id

UNION ALL 

/* All items which have max(featured)=0 row, join with min_id */
SELECT item.* , media.* 
from ITEMS item JOIN 
(select item_id, max(featured) as `featured`, min(id) as `min_id` from ITEM_MEDIA_MAP
group by item_id) as item_data ON item.id = item_data.min_id and item_data.featured = 0

对我来说,这看起来非常接近。我想,
orderby
应该是
DESC
而不是
ASC
,你会在那里。在item\u media\u map中没有id