Php 是否仍要向使用group by返回特定列的最新行的查询添加联接

Php 是否仍要向使用group by返回特定列的最新行的查询添加联接,php,mysql,sql,join,greatest-n-per-group,Php,Mysql,Sql,Join,Greatest N Per Group,上面的代码为我提供了每个组织每个请求id的最新一行,这正是我想要的,但我需要使用表中的FK来获取更多细节。 我想将organization&request表加入到上述查询中,以便使用FK在我的报告页面上显示某些内容 我用不同的方法尝试了下面的代码,但总是出现这个错误 警告:mysqli_fetch_assoc()希望参数1是mysqli_result,bool在第503行的C:\xampp\htdocs\mou1\organizationDetails.php中给出 "SELECT * FRO

上面的代码为我提供了每个组织每个请求id的最新一行,这正是我想要的,但我需要使用表中的FK来获取更多细节。 我想将organization&request表加入到上述查询中,以便使用FK在我的报告页面上显示某些内容

我用不同的方法尝试了下面的代码,但总是出现这个错误

警告:mysqli_fetch_assoc()希望参数1是mysqli_result,bool在第503行的C:\xampp\htdocs\mou1\organizationDetails.php中给出

 "SELECT * FROM report
      where id
        IN (
             SELECT MAX(id)
              FROM report
               where org_id = '$id'
                GROUP BY request_i
             ) ";

您的查询可能会失败,因为
id
WHERE
子句中不明确。您需要限定此列名:

"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
             ) ";
我修复了
request
(您在report.id=report.request\u id上有
)的连接条件中似乎存在的打字错误

我将向前迈出一步,建议重写此查询并使用相关子查询。MySQL倾向于在带有子查询的
flter中对
进行糟糕的优化,而如果有合适的索引可用,则相关子查询通常表现得非常好:

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
) 
请注意,我使用了表别名来提高查询的可读性并缩短查询。您还应该使用参数化查询,而不是在查询字符串中串联变量(此处的
代表查询参数)


对于此查询的性能,您需要在
报告(org\u id,requusst\u id,id)

上建立索引,您会得到什么错误?问题是怎么回事?有评论和回答,但没有回应。当然,除非你注销,这是完全可能的。你提到一个错误;我们需要知道那个(确切的)错误是什么。否则,我们无法帮助您,也无法猜测错误是什么,除非我们为您测试并调试它。现在这不是堆栈溢出的工作方式。你需要和我们合作,我们才能帮助你。看到了吗?这是一条双向的街道。“一种方式通常会一事无成”。@FunkFortyNiner我在睡觉前就发布了这个问题,谢谢你的建议。
SELECT*
(我知道;稍后会提到,但仍然如此)@草莓:谢谢你对否决票的评论。但对我来说,这是荒谬的。(1) 本答案中提到了
select*
——正如您所发现的(2)它显然与OP面临的错误无关(3)我们不能提出其他建议,因为我们没有看到问题(4)中的表结构。正如您所见,答案中的表结构远不止这些(发现输入错误、SQL注入警告、重新表述查询的建议、性能提示……)我完全同意所有这些
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
)