如何将参数从查询传递到子查询

本文关键字:查询 参数 | 更新日期: 2023-09-27 18:13:06

在MySQL工作台中,我可以这样做

SELECT 
    projects.ProjectName
    , @a:=projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*), projectID 
                 FROM eventTable 
                 WHERE eventTime > @a 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID;

(我的查询实际上更长,但这个简单的可以显示我的问题)

在c#中,每个参数都需要用MySqlCommand.Parameters.AddWithValue("@a",...)

预定义。

如何将参数从顶级查询传递到子查询?

如何将参数从查询传递到子查询

就您的查询而言,我想知道您是否可能使事情过于复杂。拥有子查询会增加处理需求,因此通常最好找到替代解决方案。

如注释中所述,您不需要将该项作为参数传递给子查询,因为任何连接表的值都可以在链接中的子查询中使用。使用您的示例:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*), projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID

我希望你可能会对这个子查询做一些额外的工作,可能是在WHERE子句中。在这种情况下,我建议您可能最终也会查看GROUP BYHAVING等选项,这些选项不需要您为每行运行子查询。

使用您的查询,并假设您想知道一个项目在项目开始后有超过10个事件的地方:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 
HAVING 
    COUNT(*) > 10

我的回答主要是猜测,如果你想添加更多的细节,作为实际问题的经验,我很乐意再看看这个。但如前所述,在您的示例中,您实际上不需要使用参数。


编辑/添加:

增加以下信息:

我需要的结果是一个表(显示)项目列表和每个项目有多少事件,以及何时是最后一个

事件表有超过1000万条记录,而项目表有20万条记录

让我认为我认为子查询(据我所知扫描整个表)和连接到一个大表的效率低下是差不多的。MySql通常很擅长优化自己的查询;我知道使用EXPLAIN这样的函数通常会给出如何改进索引等的指针。

以下是我对以上评论的建议:

子查询:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*) totalEvents, MAX(eventTime) lastEventTime, projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID
加入:

SELECT 
    projects.ProjectName
    , projects.StartDate 
    , COUNT(*) totalEvents
    , MAX(eventTime) lastEventTime
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 

在评论中对每个人的表现的任何反馈显然对我的学习也很有帮助:-)