我有一个获取搜索结果的查询,效果很好。
查询成功示例:
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/