【问题标题】:Compare counts from subqueries比较子查询的计数
【发布时间】:2014-01-14 12:29:42
【问题描述】:

是否可以像这样比较子查询计数结果:

SELECT
    c_contact.id,
    c_contact.name,
    c_contact.firstnames,
    c_contact.securityid
FROM c_monitoring 
  JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
  JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
  JOIN c_event ON c_event.id = c_ln_event_debtor.f_event
WHERE
  ( 
    SELECT count(c_event.id) 
    FROM c_event 
    WHERE c_event.id = c_ln_event_debtor.f_event
    AND c_event.f_status IN(50,51,52)
  ) = (
    SELECT count(c_event.id)
    FROM c_event
    WHERE c_event.id = c_ln_event_debtor.f_event
  )
GROUP BY
    c_monitoring.securityid

只有当所有引用 c_event 行的 f_status 为 50 或 51 或 52 时,我才希望将行设置为结果集。我试过这个但没有运气。

【问题讨论】:

  • 你试过运行这个吗?
  • 这当然是错误的,但是对于您的预期结果,来自 c_event 和 c_ln_event_debtor 的行是否应该与当前的 c_monitoring/c_contact 相关?
  • 你真的需要通过COUNTing来做吗? WHERE NOT EXISTS 怎么样(Select ... WHERE f_status not in (50,51,52))
  • @Rachcha 是的,我有。不工作。
  • @regilero c_monitoring 对 c_contact 的引用。 C_contact 引用 c_ln_event_debtor。 C_ln_event_debtor 引用 c_event

标签: mysql count compare subquery


【解决方案1】:

我喜欢这种查询的EXISTS 子句。下面我们过滤掉 f_status 不是 50,51,51 的 c_events:

SELECT
    c_contact.id,
    c_contact.name,
    c_contact.firstnames,
    c_contact.securityid
FROM c_monitoring 
  JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
  JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
  JOIN c_event ON c_event.id = c_ln_event_debtor.f_contact
WHERE NOT EXISTS (
    SELECT 1
        FROM c_event 
        WHERE c_event.id = c_ln_event_debtor.f_event
        AND c_event.f_status NOT IN (50,51,52)
    )

GROUP BY
    c_monitoring.securityid

如果以上仍然产生意外结果,那么您可以将 EXISTS 加入 c_ln_event_debtor:

SELECT
            c_contact.id,
            c_contact.name,
            c_contact.firstnames,
            c_contact.securityid
        FROM c_monitoring 
          JOIN c_contact ON c_contact.securityid = c_monitoring.securityid 
          JOIN c_ln_event_debtor ON c_ln_event_debtor.f_contact = c_contact.id 
          JOIN c_event ON c_event.id = c_ln_event_debtor.f_event
        WHERE NOT EXISTS (
            SELECT 1
                FROM 
                c_ln_event_debtor d
                JOIN c_event ce ON ce.id = d.f_event
                WHERE d.f_contact = c_contact.id
                AND ce.f_status NOT IN (50,51,52)
            )

        GROUP BY
            c_monitoring.securityid;

编辑:我注意到 c_event 上的加入使用 c_ln_event_debtor.f_contact 这是故意的吗?

【讨论】:

  • 不起作用。如果有其他 f_statuses 超过 50,51,52 的 c_events 则返回行
  • @AngularAddict 查看您的查询,您正在使用f_contact 字段加入c_event。这是故意的吗?
  • 谢谢。这第二个钉了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多