C# 如何将参数从查询传递到子查询?
在MySQL工作台中,我可以做类似的事情C# 如何将参数从查询传递到子查询?,c#,mysql,sql,C#,Mysql,Sql,在MySQL工作台中,我可以做类似的事情 SELECT projects.ProjectName , @a:=projects.StartDate FROM projects INNER JOIN ( SELECT COUNT(*), projectID FROM eventTable WHERE eventTime > @a GROUP BY e
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
子句中。在本例中,我建议您可能最终也会研究一些选项,例如groupby
和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
我的回答主要是猜测,如果你想补充更多关于正在经历的实际问题的细节,我很高兴再次研究这个问题。但如前所述,在您的示例中,实际上不需要使用参数
编辑/添加:
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
添加以下信息:
我需要的结果是一个项目列表(显示),每个项目有多少个事件,最后一个是什么时候
及
事件表有1000多万条记录,而项目有20条
让我觉得,我认为子查询(据我所知,它扫描整个表)和连接到一个大表的效率大约相当。MySql通常非常擅长优化自己的查询;我知道,使用函数,例如,将经常给出如何改进索引等方面的指针
以下是我对上述评论的建议:
子查询:
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
加入:
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
评论中对每一项性能的任何反馈显然也会对我的学习有很大帮助:-)一个参数将立即在任何地方可用;但是,我可以检查一下:您是否可以不只是引用内部查询中的列?i、 e.
where eventTime>projects.StartDate
?我在找到了解决方案。需要在连接字符串中添加:“Allow User Variables=True”Marc,谢谢您的回答。否我无法在子查询中引用外部查询的列。子查询没有“意识到”主查询。谢谢,我将尝试删除子查询。我需要的结果是一个项目列表(显示),每个项目有多少个事件,最后一个是什么时候。事件表有超过1000万条记录,而项目有20条记录,因此我不想联接它们。子查询出现错误:“where子句”中的未知列“projects.StartDate”联接查询存在一个问题,即“count”在联接表上起作用,因此向所有项目重新联接相同的值。我不想浪费你的时间,因为我用“允许用户变量=True”解决了这个问题,再次感谢。