14

假设我有两个一对多关系的表。

而且,我想从每个主记录中选择列以及相关表中的第一条记录。

我尝试了一些方法,但它就是不走...

在这里,我最终得到了这个 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;

关于如何解决它的任何想法?

4

4 回答 4

29

不,您不能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
       ) ;
于 2012-08-09T14:20:28.057 回答
2

如果您不关心文章返回的图像,您可以在子查询中选择按文章分组的MINMAX图像(而不是执行 a )LIMIT 1

SQL小提琴

于 2012-08-09T14:21:55.700 回答
2

您可以按照建议使用 min 或 max :

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.

于 2012-08-09T14:31:16.133 回答
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

子查询找到一篇随机“文章”。然后加入这方面的信息。

于 2012-08-09T14:22:00.333 回答