在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",...)
如何将参数从顶部查询传递到子查询?
答案 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 BY
和HAVING
这样的选项,这些选项不会要求您为每一行运行子查询。
使用您的查询,并假设您想知道项目在项目开始后有多于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
评论中对每个评论的表现的任何反馈显然对我的学习都很好: - )