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

时间:2014-07-16 09:01:03

标签: c# mysql sql

在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",...)

预定义

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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


修改/ ADDITION:

增加以下信息:

  

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

  

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

让我觉得我认为子查询的低效率(根据我的知识扫描整个表格)和加入大型表格是相同的。 MySql通常非常擅长优化它自己的查询;我知道使用诸如EXPLAIN之类的函数通常会指出如何改进索引等。

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

<强> SUBQUERY:

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

<强> JOIN:

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 

评论中对每个评论的表现的任何反馈显然对我的学习都很好: - )