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