假设我有一对多关系的两个表。
并且,我想从每个主记录中选择列以及相关表中的第一个记录。
我尝试了一些方法,但它不会......
在这里,我最终得到了这个SQL小提琴:
http://sqlfiddle.com/#!2/39fdb/3
问题在于它无法从子选择中引用a.ID。
当然,这不起作用,但这只是我能想到的全部
select a.*,b.* from event a left join
(select * from event_pictures where a.ID=article limit 1)
b on a.ID=b.article;
关于如何修复它的任何想法?
答案 0 :(得分:18)
不,您无法在加入a.ID
的子选择中引用a
。您可以执行以下操作,但最好提供订购。否则,没有“第一”行。将选择表b中的(或多或少)随机行:
select a.*, b.*
from event a
left join event_pictures b
on b.PK = --- the PRIMARY KEY
( select bb.PK --- of event_pictures
from event_pictures bb
where a.ID = bb.article
ORDER BY bb.something
limit 1
) ;
答案 1 :(得分:2)
如果您不关心文章返回的图片,可以在子查询中选择按文章分组的MIN
或MAX
图片(而不是LIMIT 1
)
答案 2 :(得分:2)
您可以使用已建议的最小值或最大值:
select
e.*,
(
select min(ep.img)
from event_pictures as ep
where ep2.article = e.article
) as img
from
event as e
如果您想要基于最高ID的img:
select
e.*,
(
select ep2.img
from event_pictures as ep2
where ep2.ID = last_ep.last_ID
) as img
from
event as e inner join -- could be a left join if necessary
(
select ep.article, max(ep.ID) as last_ID
from event_pictures as ep
group by ep.article
) as last_ep
on last_ep.article = e.ID
这两种方法都不需要使用limit
。
答案 3 :(得分:0)
这是一种方法:
select e.*, ep.*
from (select e.*,
(select article
from event_pictures ep
where ep.article = e.id
order by rand()
limit 1
) as eparticle
from event e
) e left join
event_pictures ep
on e.eparticle = ep.article
子查询找到一个randome“文章”。然后将其中的信息加入。