如何将参数从查询传递到子查询
本文关键字:查询 参数 | 更新日期: 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 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
我的回答主要是猜测,如果你想添加更多的细节,作为实际问题的经验,我很乐意再看看这个。但如前所述,在您的示例中,您实际上不需要使用参数。
编辑/添加:
增加以下信息:
我需要的结果是一个表(显示)项目列表和每个项目有多少事件,以及何时是最后一个
和
事件表有超过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
在评论中对每个人的表现的任何反馈显然对我的学习也很有帮助:-)