2016-07-26 1 views
0

MySQL-db에는 두 개의 테이블 customercall이 있습니다. 두 개의 필드가MySQL - 지난 두 시간 동안 전화하지 않은 모든 고객을 얻는 방법

고객 : ID이름.

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

아직 호출되지 않은 고객이 있습니다

전화는 필드가 있습니다. 고객은 여러 번 호출 될 수 있습니다.

지난 두 시간 동안 전화하지 않은 모든 고객을 얻으려면 어떻게 쿼리를 작성합니까? 스키마와 최소한의 데이터

SQL 바이올린 : http://sqlfiddle.com/#!9/5c80f/1 (곰 SQL 바이올린 서버가 당신보다 다른 시간대에있을 수 있다는 점에서!)

+1

http://sqlfiddle.com/에서 스키마를 준비해주세요. – motto

+0

@motto : 좋은 생각입니다. 질문에 SQL Fiddle을 포함 시켰습니다. – Mathias

답변

1

우리는 마지막 한 사람에 대해 확인해야 전화를 받았다. 다음은 업데이트 된 sql입니다. 당신은 왼쪽 외부와 date_sub 사용할 수 있습니다

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 
+0

예, 나는 한번도 전화 한 적이없는 고객을 원합니다. 지난 두 시간 동안 전화하지 않은 모든 고객을 원합니다. – Mathias

+0

이 쿼리를 수정했습니다. – Neeraj

+0

테이블 호출의 이름을 짓는 것은 어리석은 짓이었습니다. 검색어 (\'call \')에서 이스케이프시켜 키워드로 가져 오지 않을 수 있습니까? – Mathias

1
SELECT * FROM customer 
WHERE id NOT IN (
    SELECT DISTINCT customer FROM `call` 
    WHERE timeOfCall NOT BETWEEN 
    SUBTIME(curtime() , '02:00:00') AND curtime()); 
0

가입 :

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_SUB와 DATE_ADD 대체합니다. 혼동 할 필요가 없습니다.

+0

뭔가 잘못 된 것 같습니다. 쿼리를 실행할 때, 응답으로 Mesut 만 반환하고, Mehtap 및 Maksym에서는 빠져 나옵니다. (시도 : 22:21 26.7.16) – Mathias

+0

유망 해 보입니다. 결과가 정확합니다. 질문에서 이해할 수없는 부분 :'WHERE call.customer IS NULL' -> call.customer는 NOT NULL 필드입니다. 'call.dateOfCall 이게 뭐야? @Motto : – Mathias

+0

cu # 9가 지난 2 시간 내에 호출되도록 샘플 데이터를 변경 했으므로 결과 집합에 나타나지 않아야하지만 http://sqlfiddle.com/#!9/bdf006/ 1 네,하지만 call.customer가 NULL인지 확인하는 이유는 무엇입니까? 해당 필드는 절대로 NULL이 아닙니다. @ 모토 – Mathias