【问题标题】:MySQL - How to get all Customers who haven't been called in the last two hoursMySQL - 如何获取过去两个小时内未致电的所有客户
【发布时间】:2016-11-30 12:45:54
【问题描述】:

在我的 MySQL-db 中,我有两个表 customercall

客户有两个字段:idname

调用有以下字段:

id 
customer (NOT NULL FK)
dateOfCall (NOT NULL DATE)
timeOfCall (NOT NULL TIME).

有尚未呼叫的客户。可以多次调用客户。

如何进行查询以获取过去两个小时内未致电的所有客户?

SQL Fiddle 与架构和一些最小数据:http://sqlfiddle.com/#!9/5c80f/1(请记住,SQL Fiddle 服务器可能与您位于另一个时区!)

【问题讨论】:

  • 能否请您在sqlfiddle.com中准备一个架构
  • @motto:好主意。我现在在问题中包含了一个 SQL Fiddle。

标签: mysql sql join foreign-keys foreign-key-relationship


【解决方案1】:
SELECT * FROM customer 
WHERE id NOT IN (
    SELECT DISTINCT customer FROM `call` 
    WHERE timeOfCall NOT BETWEEN 
    SUBTIME(curtime() , '02:00:00') AND curtime());

【讨论】:

    【解决方案2】:

    我们需要检查一个人上次接到电话的时间。这是更新的sql。

    Select 
        cust.* 
    from 
        `customer` cust 
    left join 
    (
        select
        customer
        from `call` cl 
        group by customer
        having 
        max(STR_TO_DATE(CONCAT(cl.dateOfCall, ' ', cl.timeOfCall), '%Y-%m-%d %H:%i:%s')) >= date_sub(NOW(), interval 2 hour)
    ) aa on cust.id = aa.customer
    where aa.customer is null
    

    【讨论】:

    • 是的,我也想要从未被呼叫过的客户。我想要所有在过去两个小时内没有接到电话的客户。
    • 修改了查询。
    • 我很愚蠢地给表调用命名。你能在你的查询(`call`)中转义它,这样它就不会被当作关键字吗?
    • 转义了名字。
    • @Mathias- 现在检查 sql。我们需要检查一个人上次接到电话的时间,而不是像我们以前那样对照他接到的所有电话。
    【解决方案3】:

    您可以将date_sub 与左外连接一起使用:

    SELECT * 
    FROM `customer` as cu
    LEFT OUTER JOIN 
    (
    SELECT * FROM `call` WHERE 
     call.dateOfCall >= DATE_FORMAT(DATE_SUB(CURTIME(), INTERVAL 2 HOUR),'%Y-%m-%d') 
     AND
     ( call.timeOfCall > DATE_SUB(CURTIME(), INTERVAL 2 HOUR ) )
    ) as ca
      ON (ca.customer = cu.id)
      WHERE ca.customer IS NULL;
    

    fiddle

    编辑:将 date_add 替换为 date_sub。无需混淆。

    【讨论】:

    • 好像有问题。当我运行查询时,它只返回 Mesut 作为答案,它错过了 Mehtap 和 Maksym。 (在 22:21 26.7.16 尝试)
    • 这看起来很有希望并且结果集是正确的。我在您的查询中不明白的是:WHERE call.customer IS NULL -> call.customer 是一个 NOT NULL 字段。 call.dateOfCall < DATE_SUB(NOW(),INTERVAL 2 HOUR) -> 这是在做什么? @座右铭:
    • 我更改了样本数据,以便 cu #9 在过去 2 小时内被调用,因此他不应该出现在结果集中,但他确实出现了:sqlfiddle.com/#!9/bdf006/1 是的,但为什么要检查调用.customer 为空?该字段永远不会为 NULL。 @座右铭
    • @Mathias 好像我之前犯了一个错误,现在修复它。关于null,在结果集中可以为null,也可以为null。因为您看到的是带有连接表的修改后的结果集。如果连接表中有记录,则它不会为空,但如果没有,则在结果集中反映为空,这就是我们过滤结果集的方式。
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多