mysql加入限制1

时间:2012-08-09 14:13:21

标签: mysql sql

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

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

我尝试了一些方法,但它不会......

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

答案 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)

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

SQL Fiddle

答案 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“文章”。然后将其中的信息加入。