无论如何,他们是不是要向使用 group by 返回特定列的最新行的查询添加连接

Posted

技术标签:

【中文标题】无论如何,他们是不是要向使用 group by 返回特定列的最新行的查询添加连接【英文标题】:Is their anyway to add a join to a query that returns the latest rows of a specific column using group by无论如何,他们是否要向使用 group by 返回特定列的最新行的查询添加连接 【发布时间】:2020-09-19 06:13:32 【问题描述】:
 "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,布尔值在 C:\xampp\htdocs\mou1\organizationDetails.php 第 503 行给出

"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

【问题讨论】:

你得到什么错误? 这个问题是怎么回事?有评论和答案,但没有回应。除非您当然退出,这是完全可能的。你提到了一个错误;我们需要知道那个(确切的)错误是什么。否则,我们无法帮助您,也无法猜测该错误是什么,除非我们为您测试并为您调试。现在这不是 Stack Overflow 上的工作方式。您需要与我们合作,以便我们为您提供帮助。你看?这是一条双向的街道。一种方法通常会一事无成。 @FunkFortyNiner 我在睡觉前发布了这个问题,谢谢你的建议。 【参考方案1】:

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

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) 上建立索引。

【讨论】:

SELECT * 没有什么好消息(我知道;稍后提到过,但仍然如此) @Strawberry:感谢您对不赞成票发表评论。但对我来说,这很荒谬。 (1) 这个答案中提到了select * - 正如您所发现的那样 (2) 它显然与 OP 面临的错误无关 (3) 我们不能提出其他建议,因为我们看不到表结构问题 (4) 如您所见,答案远不止于此(发现错字、关于 SQL 注入的警告、改写查询的建议、性能提示……) 我完全同意所有这些

以上是关于无论如何,他们是不是要向使用 group by 返回特定列的最新行的查询添加连接的主要内容,如果未能解决你的问题,请参考以下文章

关于C#中group by如何实现多条件分组汇总

当尝试在 group_by 和 mutate 中使用 get() 调用对象时,它会调出整个对象而不是分组对象。我该如何解决?

如何在这种情况下使用group by表达式?

group by与distinct有何区别

在oracle里 group by 分组是怎么回事 为啥有时候不加group by说不是单组分组函数?

去重是distinct还是group by