MySQL查询-数据未按预期显示,代码中存在问题

MySQL查询-数据未按预期显示,代码中存在问题,mysql,sql,Mysql,Sql,我正在试图查询一个数据库,查找在给定日期没有到达预定地点的人数。然而,给出的结果并不像预期的那样 通过手动检查,2021年5月3日的结果应显示为3。我感觉客户id与显示的结果一起添加,而不仅仅是单个客户id的计数 select count(c.CUSTOMER_ID) AS 'No Shows', date(checkins.POSTDATE) as date from customers c, checkins where checkins.postdate >

我正在试图查询一个数据库,查找在给定日期没有到达预定地点的人数。然而,给出的结果并不像预期的那样

通过手动检查,2021年5月3日的结果应显示为3。我感觉客户id与显示的结果一起添加,而不仅仅是单个客户id的计数

select
    count(c.CUSTOMER_ID) AS 'No Shows',
    date(checkins.POSTDATE) as date
from
  customers c, checkins
where
    checkins.postdate >= date_sub(curdate(), interval 7 day)
    and
  (
    c.archived = 0
    and (
      (
        (
          (
            (
              (
                c.GUID in (
                  select
                    sb1.customer_guid
                  from
                    schedule_bookings sb1
                    join schedule_events se1 on sb1.course_guid = se1.course_guid
                    and sb1.OFFERING_ID in (
                      '2915911', '3022748', '3020740', '2915949',
                      '2914398', '2916147', '3022701',
                      '3020699', '2916185', '2915168',
                      '2916711', '3022403', '3020455',
                      '2916785', '2916478', '2915508',
                      '3022538', '3020582', '2915994',
                      '2914547', '2916069', '3022648',
                      '3020658', '2916107', '2915290',
                      '2928786', '2914729', '3022854',
                      '3020812', '2914694', '2914659',
                      '3041801', '2920756', '2920834',
                      '2920795', '2916223', '3022788',
                      '3020783', '2916239', '2915013'
                    )
                    and sb1.CANCELLED in ('0')
                )
              )
              or (
                c.GUID in (
                  select
                    sp.customer_guid
                  from
                    schedule_participants sp
                    join schedule_bookings sb2 on sp.BOOKING_ID = sb2.BOOKING_ID
                    join schedule_events se2 on sb2.course_guid = se2.course_guid
                    and sb2.OFFERING_ID in (
                      '2915911', '3022748', '3020740', '2915949',
                      '2914398', '2916147', '3022701',
                      '3020699', '2916185', '2915168',
                      '2916711', '3022403', '3020455',
                      '2916785', '2916478', '2915508',
                      '3022538', '3020582', '2915994',
                      '2914547', '2916069', '3022648',
                      '3020658', '2916107', '2915290',
                      '2928786', '2914729', '3022854',
                      '3020812', '2914694', '2914659',
                      '3041801', '2920756', '2920834',
                      '2920795', '2916223', '3022788',
                      '3020783', '2916239', '2915013'
                    )
                    and sb2.CANCELLED in ('0')
                )
              )
            )
          )
        )
        and (
          (
            (
              not (
                (
                  (
                    select
                        count(CHECKIN_ID)
                    from
                      checkins
                    where
                      checkins.CUSTOMER_ID = c.CUSTOMER_ID
                  ) between 1
                  and 9999
                )
              )
            )
          )
        )
      )
    )
    and not c.customer_id in (1008, 283429, 2507795)
  )
group by date(checkins.POSTDATE)
结果如下:

+----------+------------+
| No Shows | date       |
+----------+------------+
|    30627 | 2021-04-27 |
|    37638 | 2021-04-28 |
|    34071 | 2021-04-29 |
|    33579 | 2021-04-30 |
|    29274 | 2021-05-01 |
|    30135 | 2021-05-02 |
|    48339 | 2021-05-03 |
|     8979 | 2021-05-04 |
+----------+------------+
8 rows in set (8.71 sec)
正如你所看到的,计数远没有达到预期的水平

查询参数包括:

客户是所列特定产品(产品id)的参与者/受赌注者 客户的“签入”计数不在1和9999之间。 按每个日期的计数显示这些结果

有人知道为什么这个查询不能按预期显示结果吗

问候
汤姆

让我们试着把这一点颠倒过来。您正在处理一组非常有限的产品ID。比如从你所关心的有限的产品列表开始,然后再加入。此外,似乎不需要连接到schedule events表。如果什么东西被预订了,它就被预订了。您永远不会从事件本身获得任何附加上下文

所以,让我们从一个非常简单的联合开始。您正在查看预订表以查找可能的客户ID。然后从实际参与者那里获得相同的预订。我的猜测是,并不是每个实际预订的人都可能是参与者,同样,所有参与者也可能不是预订方

所有这些都与实际的最终客户、归档状态甚至预订活动无关。我们只是得到了人-时期。一旦你有了这些人和日期,就可以得到这些数字

select
        date(CI.POSTDATE) as date,
        count( JustCustomers.customer_guid ) AS 'No Shows'
    from
    (
        select
                sb1.customer_guid
            from
                schedule_bookings sb1
            where
                    sb1.CANCELLED = 0
               -- if "ID" are numeric, dont use quotes to imply character
                and sb1.OFFERING_ID in 
                (   2915911, 3022748, 3020740, 2915949,
                    2914398, 2916147, 3022701, 3020699, 
                    2916185, 2915168, 2916711, 3022403, 
                    3020455, 2916785, 2916478, 2915508,
                    3022538, 3020582, 2915994, 2914547, 
                    2916069, 3022648, 3020658, 2916107, 
                    2915290, 2928786, 2914729, 3022854,
                    3020812, 2914694, 2914659, 3041801, 
                    2920756, 2920834, 2920795, 2916223, 
                    3022788, 3020783, 2916239, 2915013 
                )
        UNION
        select
                sp.customer_guid
            from
                schedule_bookings sb2
                    JOIN schedule_participants sp
                        on sb2.BOOKING_ID = sp.BOOKING_ID
            where
                    sb2.CANCELLED = 0
                and sb2.OFFERING_ID in 
                (   2915911, 3022748, 3020740, 2915949,
                    2914398, 2916147, 3022701, 3020699, 
                    2916185, 2915168, 2916711, 3022403, 
                    3020455, 2916785, 2916478, 2915508,
                    3022538, 3020582, 2915994, 2914547, 
                    2916069, 3022648, 3020658, 2916107, 
                    2915290, 2928786, 2914729, 3022854,
                    3020812, 2914694, 2914659, 3041801, 
                    2920756, 2920834, 2920795, 2916223, 
                    3022788, 3020783, 2916239, 2915013 
                )
        ) JustCustomers
             JOIN customers c
                on JustCustomers.customer_guid = c.customer_id
                AND c.archived = 0
                AND NOT c.customer_id IN (1008, 283429, 2507795)

                JOIN checkins CI
                    on c.CUSTOMER_ID = CI.CUSTOMER_ID
                    AND CI.postdate >= date_sub(curdate(), interval 7 day)
   group by 
      date(ci.POSTDATE)
我注意到的一件奇怪的事情是,你在寻找“没有演出”,但明确地寻找那些登记入住的人。现在,如果您要查找所有应该参加某个活动的人,那么您可能要查找客户没有登记入住的地方。如果这是预期的情况,则不会关联入住日期。如果是这样的话,我希望在一些表中有一个日期,比如事件日期。。。比如说乘船旅行,不管是谁到了船上,活动都是在乘船旅行的时候进行的


如果我有点不对劲,我建议你编辑你现有的帖子,提供更多的细节/澄清。

这个查询中有很多“噪音”,但是测试3的预期结果的一个快速方法可能是使用
计数(不同的c.CUSTOMER\u ID)
,因为这将在一定程度上从嵌套中排除重复项。嘿,Matigo,感谢您建议调用测试。我只是运行了不同的计数,结果是每个结果都是完全相同的数字(123)——奇数!看来我需要联系一下这个软件的创建者。这一切都有点倒退。