无论如何将联接添加到使用group by返回特定列的最新行的查询中

问题描述 投票:-1回答:1
 "SELECT * FROM report
      where id
        IN (
             SELECT MAX(id)
              FROM report
               where org_id = '$id'
                GROUP BY request_i
             ) ";

上面的代码为我提供了每个组织的每个request_id的最新行,这正是我想要的,但是我需要使用表中的FK以获得更多详细信息。我想将组织和请求表加入上述查询,以便我可以使用FK在报告页面上显示某些内容。

我以不同的方式尝试了下面的代码,但我总是遇到此错误。

警告:mysqli_fetch_assoc()期望参数1为mysqli_result,在503行的C:\ xampp \ htdocs \ mou1 \ organizationDetails.php中给出的布尔值

"SELECT * FROM report
      JOIN request ON
      report.id = report.request_id
      JOIN organization ON
      organization.id = report.org_id
      where id
        IN (
             SELECT MAX(id)
              FROM report
               where org_id = '$id'
                GROUP BY request_i
             ) ";

Code Snippet

php mysql sql join greatest-n-per-group
1个回答
0
投票

大概是因为id子句中的WHERE不明确,所以查询失败。您需要限定此列名称:

SELECT * 
FROM report
JOIN request ON request.id = report.request_id
JOIN organization ON organization.id = report.org_id
WHERE report.id IN (
    SELECT MAX(id)
    FROM report
    where org_id = '$id'
    GROUP BY request_id
) 

我固定了request(您有ON report.id = report.request_id)的加入条件下的错字。

我将向前迈出一步,建议重写此查询并使用相关的子查询。 MySQL倾向于使用子查询来优化IN过滤器,而如果有合适的索引,则相关的子查询通常会表现得很好:

select *   -- you should enumerate the columns here
from report rep
inner join request req      on req.id = rep.request_id
inner join organization org on org.id = rep.org_id
where rep.id = (
    select max(rep1.id)
    from report rep1
    where rep1.org_id = ? and rep1.request_id = rep.request_id
)

注意,我使用表别名使查询更具可读性并缩短查询时间。您还应该使用参数化查询,而不是在查询字符串中连接变量(?代表此处的查询参数)。

为了提高此查询的性能,您需要在report(org_id, requsst_id, id)上建立索引。

© www.soinside.com 2019 - 2024. All rights reserved.