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

标签 mysql sql join subquery

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

查询成功示例:

 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 中都有不止一条记录,这是我想要获取最大值(最新 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 individual_achievements;第二个是对不在子查询中的 individuals_achievements.individual_id 的引用。第三个是按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。

顺便说一下,表别名与表名同名是多余的。这只会让查询变得困惑。另外,最好使用别名的表缩写,例如 ia 表示 individuals_achievements。因为这个答案只关注 from 子句,所以我没有做出这样的改变。

关于mysql - 使用子查询与 LEFT JOIN 一起选择 MAX 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902790/

相关文章:

mysql - 多次更新mysql

Mysql查询成员(member)是否上过课

mysql - 不能将左连接与联合结合

sql - 如何更改spark sql中的列值

java - 在 Left Join 中找不到列

mysql - 查询查找包含字母的字段中的所有单词

mysql - .mysql_history 没有被自动保存

mysql - 自动更改枚举列

sql - 计算跨列的参与百分比

php - mysql 不显示所有数据库