首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子查询来选择最大值和左联接。

使用子查询来选择最大值和左联接。
EN

Stack Overflow用户
提问于 2013-09-19 18:56:51
回答 5查看 12K关注 0票数 2

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

成功查询的示例:

代码语言:javascript
复制
 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()的错误rowCount()调用。

我明白这个错误意味着什么,但我不知道我在哪里犯了这个错误,总体上是什么错了。

我尝试失败的例子:

代码语言:javascript
复制
  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

我在这里错过了什么?有什么帮助吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-19 19:16:26

这是您的from条款:

代码语言:javascript
复制
  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

代码语言:javascript
复制
  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子句,所以我没有做这个更改。

票数 2
EN

Stack Overflow用户

发布于 2013-09-19 19:08:42

如果在处理查询时出现错误,PDO::query将返回一个FALSE,并且将rowCount作为成员函数应用于FALSE将导致所看到的错误。

检查查询中是否存在语法错误,并解析PDO将返回的任何错误消息。

票数 0
EN

Stack Overflow用户

发布于 2013-09-19 19:14:09

代码语言:javascript
复制
INNER JOIN
  (
       SELECT
            degree, MAX(id) AS latest_record,individual_id
       FROM
            individuals_achievements
       GROUP BY
            latest_record
  ) individuals_achievements AS individuals_achievements_1 ON individuals.unique_id = individuals_achievements_1.individual_id

它应该是

INNER JOIN (SELECT blah) AS something ON individuals.unique_id=something.individual_id

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18902790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档