【问题标题】:Subquery with two columns具有两列的子查询
【发布时间】:2014-09-03 13:42:13
【问题描述】:

我有两张桌子,像这样:

a.id、a.created、a.b
b.id, b.name, b.created

我希望表 b 中的所有记录都按 a.created 时间戳排序。

我一直在尝试以下方法:

SELECT b.id, b.name FROM b JOIN a ON a.b = b.id ORDER BY b.created DESC

但它总是从 b 返回多条记录,而我真正想要的只是 b 的每一行匹配一个 a。 p>

我尝试使用 SELECT 子查询:

SELECT b.id, b.name, (SELECT a.created AS a_c FROM a WHERE
a.b = b.id) AS a_c FROM b ORDER BY a_c DESC

但我也希望能够提取 a.id。

有没有我可以使用的 JOIN 语句或者我应该使用两个子查询?这将是我的应用程序中非常重要的功能,所以我希望性能高于标准!

【问题讨论】:

  • 你试过了吗? SELECT DISTINCT b.id, b.name FROM b JOIN a ON a.b = b.id ORDER BY b.created DESC
  • 如果你也想拉a.id,并且a有多个匹配的行,你想拉哪一个?
  • @Barmar 我想匹配a 的最新记录。例如ORDER BY a.created DESC LIMIT 1
  • 您需要进行子选择并加入其中。

标签: mysql


【解决方案1】:

我最终只是以suggested in this answer 的身份加入表格。

SELECT b.id, b.name, a.id AS a_id FROM b JOIN a ON
a.id = (SELECT a.id FROM a WHERE a.b=b.id ORDER BY 
a.created DESC LIMIT 1)

【讨论】:

    【解决方案2】:
    select
       b.id
      ,b.name
      ,b.created as b_created
      ,a.created as a_created 
    from b
    left join a
    join (
       select b, max(created) as max_creatd
       from a
       group by b
    )a_min
       on a_min.b = a.b
      and a_min.max_creatd = a.created
       on a.b   = b.id
    

    对于这些数据集(避免编写大量 DDL 的 SQL Server 语法):

    a as (select * from (values
         ('A1','20140701 23:11:59', 'B1')
        ,('A2','20140701 22:11:59', 'B1')
      )a(id,created,b)
    

    b as ( select * from (values
        ('B1', 'Bob', '20140701 11:59:59')
       ,('B2', 'Bub', '20140701 10:59:59')
      )b(id,name,created)
    

    返回以下内容:

    id   name b_created         a_created
    ---- ---- ----------------- -----------------
    B1   Bob  20140701 11:59:59 20140701 23:11:59
    B2   Bub  20140701 10:59:59 NULL
    
    (2 row(s) affected)
    

    【讨论】:

      【解决方案3】:
      select b.id, b.name, a.id a_id, a.created
      from b join (
          select b, max(a.created) max_created
          from a
          group by b
      ) t1 on t1.b = b.id
      join a on a.b = b.id and a.created = t1.max_created
      order by a.created desc
      

      【讨论】:

        【解决方案4】:
        SELECT b.id AS bid, b.name, a.id AS aid, a.created
        FROM b
        JOIN (SELECT a1.id, a1.b, a1.created
              FROM a AS a1
              JOIN (SELECT id, MAX(created) AS maxcreate
                    FROM a
                    GROUP BY id) AS a2
              ON a1.id = a2.id AND a1.created = a2.maxcreate) AS a
        ON b.id = a.b
        ORDER BY a.created DESC
        

        子查询获取a 中每个id 的最新创建日期的行。然后你加入这个b

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多