Sql 如何使用WHERE子句对两个表进行计数

Sql 如何使用WHERE子句对两个表进行计数,sql,count,Sql,Count,伙计们,我在SQL数据库中有三个表。tblTicketDetail、TBLenginer和tblTicket_Engineer是多对多关系的连接表。在我的应用程序中发生的是,当我生成一个新的票证时,票证被分配给一个、两个或三个max工程师,从而形成多对多关系 表的结构如下: tblTicketDetail +-----+--------+----+ |TicketID | Desc |状态| +-----+--------+----+ |1 |说明1 | 1| |2 |说明2 | 0| |3 |

伙计们,我在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。 我尝试了这个查询,但它生成了两个计数

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!