【问题标题】:mysql join with limit 1mysql join 限制为 1
【发布时间】:2012-08-06 19:05:17
【问题描述】:

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

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

我尝试了一些方法,但就是不行……

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

关于如何修复它的任何想法?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    不,您不能在连接到 a 的子选择中引用 a.ID。您可以执行以下操作,但您最好提供订单。否则,没有“第一”行。将选择表 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
           ) ;
    

    【讨论】:

    • 我当然会做订单,这只是一个简化版:) 然而,即使是随机记录图像也可以......让我们看看
    【解决方案2】:

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

    SQL Fiddle

    【讨论】:

    • 我不是专家,但看起来 group by 会工作得更慢并循环遍历每个子集。我想我最好坚持使用限制,并通过自动递增 ID 字段以自然的方式对它们进行排序(这不是默认的吗?)
    • 同意,我会选择 ypercube 更灵活的答案。
    【解决方案3】:

    这是一种方法:

    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
    

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

    【讨论】:

    • 谢谢,这是一个有趣的方案,但在我的情况下绝对是矫枉过正:-)
    【解决方案4】:

    您可以按照建议使用 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

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2014-06-03
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2012-04-26
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多