当前位置: 首页 > 面试题库 >

使用子查询与LEFT JOIN一起选择MAX值

慕阳文
2023-03-14
问题内容

我有一个查询来获取搜索结果,效果很好。

成功查询的示例:

 SELECT
    individuals.individual_id,
    individuals.unique_id,
    TIMESTAMPDIFF(YEAR,individuals.day_of_birth,CURDATE()) AS age,
    individuals_dynamics.id,
    individuals_achievements.degree
  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  LEFT JOIN
    individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id
  WHERE
    $uuid_access_status $display_type $detailed_search_query
  ORDER BY 
    $search_sort $search_order

从现在开始,我individuals_achievements每个人都有一个以上的记录,这是我想要获得MAX值(最新ID)的地方。

我尝试了许多不同的查询,但始终收到错误消息 _ ,在非对象上调用成员函数rowCount()。_

我了解该错误的含义,但我无法弄清楚该错误的出处和总体上的错误。

我未成功尝试的示例:

  SELECT
    individuals.individual_id,
    individuals.unique_id,
    TIMESTAMPDIFF(YEAR,individuals.day_of_birth,CURDATE()) AS age,
    individuals_dynamics.id,
    individuals_achievements.degree
  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  INNER JOIN
  (
       SELECT
            degree, MAX(id) AS latest_record
       FROM
            individuals_achievements
       GROUP BY
            latest_record
  ) individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id
  WHERE
    $uuid_access_status $display_type $detailed_search_query
  ORDER BY 
    $search_sort $search_order

我在这里想念什么?有什么帮助吗?


问题答案:

这是你的from条款:

  FROM
    individuals as individuals
  LEFT JOIN
    individuals_dynamics AS individuals_dynamics ON individuals.unique_id = individuals_dynamics.individual_id
  INNER JOIN
  (
       SELECT
            degree, MAX(id) AS latest_record
       FROM
            individuals_achievements
       GROUP BY
            latest_record
  ) individuals_achievements AS individuals_achievements ON individuals.unique_id = individuals_achievements.individual_id;

我至少可以发现三个问题。首先是individuals_achievements AS individuals_achievements;
第二个是individuals_achievements.individual_id子查询中没有的引用。第三是group by latest_record

  FROM individuals LEFT JOIN
       individuals_dynamics
       ON individuals.unique_id = individuals_dynamics.individual_id LEFT JOIN
       individuals_achievements
       ON individuals.unique_id = individuals_achievements.individual_id JOIN
       (SELECT ia.individual_id, MAX(ia.id) AS latest_record
        FROM individuals_achievements ia
        GROUP BY ia.individual_id
       ) iamax
       ON individuals.unique_id = iamax.individual_id and
          individuals_achievements.id = iamax.latest_record

这将添加一个附加子查询,并带有最新记录的ID。

顺便说一句,让表别名与表名同名是多余的。那只会使查询混乱。同样,对别名使用表缩写(例如iafor)也是一个好主意individuals_achievements。因为此答案仅针对from条款,所以我没有进行更改。



 类似资料:
  • 问题内容: 在将其标记为重复之前,请先看一下此SQLFiddle。 我有这个架构: 子查询: 结果: 现在,这里最棘手的部分是此查询的结果: 这是: 应该是这样的: 您认为查询中有什么问题? 问题答案: 而不是您可以简单地使用相同。也可以改用。 输出: 看到这个SQLFiddle 编辑: 如果要使用它,则必须使用如下子查询: 看到这个SQLFiddle 编辑2: 除了在外部查询中使用之外,您也可以

  • 问题内容: 我有一个MySQL UPDATE查询,需要很长时间才能完成。我是否错过了一种更简单的方法来获得相同的结果? 包含的所有可能值,每个值仅包含一条记录。 包含的一些值,但是有多个记录有一些值。 我需要更新记录中显示的相应值的出现次数中。上面的查询完成了该工作,但是当table1包含500条记录和30,000条记录时,大约需要3分钟。我有更大的表要处理,所以这太长了:) 提前致谢。 问题答案

  • 问题内容: 我有一个具有以下字段的MySQL表: 其中父字段表示上层ID。例如,水果id是1,橙色是水果之一,因此父对象是1。 但是我想做一个有效的MySQL查询来获取所有记录,格式为parent-> children-> parent-> children格式。我怎样才能做到这一点? 查询的结果记录应类似于: 问题答案: 您需要mysql不支持的递归联接。您唯一可以做的就是确定最大深度(由于p-

  • 问题内容: 当需要有序集的最后一行时,通常会创建派生表并重新排序。例如,要以自动递增的方式返回表的最后3个元素: 由于也可以具有偏移量,因此如果我们事先知道此查询的行数(例如10),则可以实现相同的结果: 是否可以对表运行子查询并使用该数字动态构建一个? 问题答案: 不,不可能指定动态偏移量。 带有子查询的原始查询是执行此操作的最简单方法。

  • 问题内容: 我有一张这样的桌子: 我需要这样的输出(与最大值分组): 试图使用像这样的东西: 但是它只选择一个具有最大值的行。如何重写查询? 问题答案: 使用ROW_NUMBER对记录进行排名,以便sku的最大值变为#1。然后仅保留那些排名第一的记录。 对于SKU 1503818,您将获得以下两个之一: 如果您想要一个特定的商品(例如商品编号更高的商品),则将此条件添加到Row_Number的OR

  • 我已尝试获取以下代码的结果: 在某些情况下,我需要在上面使用“In cause”。我尝试使用获得结果,但对于param:ref它不能在本机查询中工作,但在ejb ql中,我只是得到了以下错误消息: null 我累坏了,大家能给我一些建议吗?thx寻求帮助