Sql 如何使用WHERE子句对两个表进行计数
伙计们,我在SQL数据库中有三个表。tblTicketDetail、TBLenginer和tblTicket_Engineer是多对多关系的连接表。在我的应用程序中发生的是,当我生成一个新的票证时,票证被分配给一个、两个或三个max工程师,从而形成多对多关系 表的结构如下: tblTicketDetail +-----+--------+----+ |TicketID | Desc |状态| +-----+--------+----+ |1 |说明1 | 1| |2 |说明2 | 0| |3 |说明3 | 1| +-----+--------+----+ 特布林吉内尔 +------+----+ |工程名称| +------+----+ |1 |汤姆| |2 |哈里| |3 |约翰| +------+----+ tblTicket\U工程师 +-----+------+ |TicketID |工程| +-----+------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | | 2 | 1 | | 3 | 1 | | 3 | 2 | +-----+------+ 现在我要做的是计算所有状态为1的TicketID,其中EngineerID应该是特定的,例如1。 我尝试了这个查询,但它生成了两个计数Sql 如何使用WHERE子句对两个表进行计数,sql,count,Sql,Count,伙计们,我在SQL数据库中有三个表。tblTicketDetail、TBLenginer和tblTicket_Engineer是多对多关系的连接表。在我的应用程序中发生的是,当我生成一个新的票证时,票证被分配给一个、两个或三个max工程师,从而形成多对多关系 表的结构如下: tblTicketDetail +-----+--------+----+ |TicketID | Desc |状态| +-----+--------+----+ |1 |说明1 | 1| |2 |说明2 | 0| |3 |
SELECT (
SELECT COUNT(*) total
FROM tblTicketDetail WHERE Status = 1
) AS count1,
(
SELECT COUNT(*) total
FROM tblTicket_Engineer WHERE EngineerID = 1
) AS count2
在EngineerID=1的情况下,查询应生成2的计数。我该怎么做呢?试试这个,这可能对你有帮助
SELECT COUNT(*) total
FROM tblTicketDetail as td, tblTicket_Engineer as te
WHERE td.Status = 1
AND te.EngineerID = 1;
您可能希望使用联接:
SELECT COUNT(*) total
FROM tblTicket NATURAL JOIN tblTicket_Engineer NATURAL JOIN tblEngineer
WHERE Status = 1 AND EngineerID = 1
如果您的数据库引擎不支持多个自然联接子句,或者您不想使用它们,您可以求助于显式联接
SELECT COUNT(*) total
FROM tblTicket INNER JOIN tblTicket_Engineer ON (TicketID)
INNER JOIN tblEngineer ON (EngineedID)
WHERE Status = 1 AND EngineerID = 1
注意:不要在生产环境中使用自然连接。请参阅。您需要在子查询上创建一个联接以获取票证状态,子查询应如下所示:
SELECT COUNT(*) total
FROM tblTicket_Engineer
INNER JOIN tblTicketDetail ON tblTicketDetail.TicketID = tblTicket_Engineer.TicketID AND tblTicketDetail.Status = 1
WHERE tblTicket_Engineer.EngineerID = 1
我认为下面的代码将帮助您
SELECT Count(*) FROM
tblTicket inner join tblTicket_Engineer on
(tblTicket.TicketID= tblTicket_Engineer.TicketID)
WHERE tblTicket.Status = '1'
AND tblTicket_Engineer.EngineerID = '1'
你可以这样做
SELECT COUNT(*) total
FROM tblTicketDetail a, tblTicket_Engineer b
WHERE a.TicketID = b.TicketID AND a.Status = 1 AND b.EngineerID = 1
你能试试这个查询吗
SELECT COUNT(tblTicketDetail.TicketID) FROM tblTicketDetail
JOIN tblTicket_Engineer ON tblTicket_Engineer.TicketID = tblTicketDetail.TicketID
WHERE tblTicket_Engineer.EngineerID = 1
AND tblTicketDetail.Status = 1
不,当执行上述查询时,结果是24。您正朝着正确的方向前进,但您忘记了一个重要的部分-您需要将工程师与他们正在处理的票据联系起来!这就是为什么建议不要使用隐式联接语法逗号分隔从句,而是显式列出联接-这会使此问题更加明显。生成有关使用多个自然联接的错误。然后,此问题与SQL无关,而是与特定实现有关。哪一个是您的RDBMS?就个人而言,我会避免在任何生产数据库中使用自然联接,因为通常存在不应该联接的列,这些列应该仍然具有相同的名称-createdOn audit timestamp列,任何类型的状态列,列表继续。再加上许多次,你可能想要加入的列将不会有相同的名称-例如employeeId createdBy audit column-而且它看起来没有那么有用。你不需要严格地使用Tblinginer进行此查询。请避免隐式连接语法逗号分隔从句,以利于显式连接。工作非常完美。非常感谢!!是的,尽管我可能会将tblTicket_Engineer.engineerinid='1'移动到联接条件中。为什么在同一个表中的两个不同ID上使用联接?tblTicket_Engineer.engineerinid=tblTicket_Engineer.TicketID。他不需要两个计数,因此他不需要将此作为子查询。虽然它应该是罚款。这是根据我的要求工作!非常感谢。@Clockwork Muse只是误解了这个问题,正如我在提供的片段中所建议的那样,op需要对状态为1的所有票进行计数,然后对工程师为1的票进行另一次计数。你是对的,不需要子查询。这个查询经过一点调整后也可以按照要求工作!谢谢你的回答Khushbu!