代码之家  ›  专栏  ›  技术社区  ›  Amiga500

MySQL-内部连接上的分组方式[重复]

  •  -1
  • Amiga500  · 技术社区  · 4 年前

    在下表中,我如何获得 最近的争吵 具有 id=1 基于 signin 列,而不是全部3行?

    +----+---------------------+---------+
    | id | signin              | signout |
    +----+---------------------+---------+
    |  1 | 2011-12-12 09:27:24 | NULL    |
    |  1 | 2011-12-13 09:27:31 | NULL    |
    |  1 | 2011-12-14 09:27:34 | NULL    |
    |  2 | 2011-12-14 09:28:21 | NULL    |
    +----+---------------------+---------+
    
    0 回复  |  直到 4 年前
        1
  •  114
  •   Michael Berkowski    12 年前

    使用聚合 MAX(signin) 按id分组。这将列出最近的 signin 每人 id .

    SELECT 
     id, 
     MAX(signin) AS most_recent_signin
    FROM tbl
    GROUP BY id
    

    要获得完整的单个记录,请执行 INNER JOIN 针对只返回 麦克斯(签名) 根据身份证。

    SELECT 
      tbl.id,
      signin,
      signout
    FROM tbl
      INNER JOIN (
        SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id
      ) ms ON tbl.id = ms.id AND signin = maxsign
    WHERE tbl.id=1
    
        2
  •  92
  •   Erwin Brandstetter    4 年前
    SELECT *
    FROM   tbl
    WHERE  id = 1
    ORDER  BY signin DESC
    LIMIT  1;
    

    最明显的指标是 (id) ,或 multicolumn index 在…上 (id, signin DESC) .

    为了方便起见,MySQL排序 NULL 价值观 最后的 按降序排列。如果可能的话,这就是你通常想要的 无效的 值:最新值的行不为空 signin .

    得到 无效的 价值观优先:

    ORDER BY signin IS NOT NULL, signin DESC
    

    您可能需要向中添加更多表达式 ORDER BY 从(可能的)多行中使用 无效的 .
    同样的情况也适用 无效的 如果 签名 没有定义 UNIQUE .

    相关的:

    SQL标准没有明确定义默认的排序顺序 无效的 价值观不同的RDBMS之间的行为差异很大。见:

    但是在那里 这个 NULLS FIRST / NULLS LAST SQL标准中定义的子句,大多数主要的RDBMS都支持,但MySQL不支持。见:

        3
  •  9
  •   rantsh    12 年前

    基于@xQbert的答案,您可以避免子查询,并使其足够通用,可以按任何ID进行过滤

    SELECT id, signin, signout
    FROM dTable
    INNER JOIN(
      SELECT id, MAX(signin) AS signin
      FROM dTable
      GROUP BY id
    ) AS t1 USING(id, signin)
    
        4
  •  4
  •   xQbert    13 年前
    Select [insert your fields here]
    from tablename 
    where signin = (select max(signin) from tablename where ID = 1)
    
        5
  •  1
  •   rink.attendant.6    10 年前
    SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;
    
        6
  •  1
  •   Ales    7 年前

    我也有类似的问题。换句话说,我需要获得页面内容翻译的最后一个版本,以获得版本列中数字最高的特定记录。所以我选择所有按版本排序的记录,然后从结果中获取第一行(使用LIMIT子句)。

    SELECT *
    FROM `page_contents_translations`
    ORDER BY version DESC
    LIMIT 1
    
        7
  •  1
  •   Ajmal Jamil    5 年前

    实现的简单方法

    我知道这是个老问题 你也可以这样做

    SELECT * FROM Table WHERE id=1 ORDER BY signin DESC
    

    在上面的查询中,第一条记录将是最近的记录。

    对于一张唱片,你可以使用

    SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC
    

    以上查询只返回一条最新记录。

    干杯