2014-07-22 1 views
-3

내 테이블처럼 보이게하는 방법 :mysql을위한 조건으로 고유 값을 선택하는 방법은 무엇입니까? 여기

CREATE TABLE my_table(id INT,user_id VARCHAR(5),add_date date); 

INSERT INTO my_table 
VALUES 
    (1, 100, '2014-07-22'), 
    (2, 400, '2014-07-22'), 
    (3, 500, '2014-07-22'), 
    (4, 500, '2014-07-22'), 
    (5, 200, '2014-07-21'), 
    (6, 300, '2014-07-21'), 
    (7, 100, '2014-07-20'), 
    (8, 200, '2014-07-20'); 

는 처음에 내가
내가

**user_id** | **add_date** 
     100 | 2014-07-22 
     400 | 2014-07-22 
     500 | 2014-07-22 
     200 | 2014-07-21 
     300 | 2014-07-21 
있어, USER_ID에 의해 2014년 7월 22일에 2014년 7월 21일 사이의 질의 날짜를 확인해야하고 그룹

다음으로,이 테이블 전체 데이터를 확인해야합니다.이 사용자 ID는 고유하지 않습니까? 날짜 조건을 제외하고.

**Require Answer:** 
**user_id** | **add_date** 
     400 | 2014-07-22 
     500 | 2014-07-22 
     300 | 2014-07-21 

참고 :

나는 하나의 쿼리가 필요합니다.

+1

조건은 SQL'where','group by' 및'having' 절로 직접 변환됩니다. 너는 언어에 익숙하니? –

+0

나는 알고있다. 그러나 단지 영어를 설명한다. 그것은 그 것이다. – kumaravelmathivanan

답변

1
SELECT 
    user_id, 
    max(add_date) 
FROM my_table 
GROUP BY user_id 
HAVING -- no date outside of the requested range 
    MIN(add_date) BETWEEN '2014-07-21' and '2014-07-22' 
AND 
    MAX(add_date) BETWEEN '2014-07-21' and '2014-07-22' 
0
select 
    count(user_id) as c 
from 
    my_table 
having 
    c = 1 
    and add_date between '2014-07-21' 
    and '2014-07-22' 
group by 
    user_id 
0

일치하는 사용자 ID가 있지만 날짜가 일치하지 않는 LEFT OUTER JOIN을 사용하여 자체 테이블을 조인하십시오. 당신이 날짜 범위 내에서 중복에만 관심이 있다면

SELECT a.user_id, a.add_date 
FROM my_table a 
LEFT OUTER JOIN my_table b 
ON a.user_id = b.user_id 
AND a.add_date != b.add_date 
WHERE a.add_date between '2014-07-21' and '2014-07-22' 
GROUP BY a.user_id, a.add_date 
HAVING COUNT(b.user_id) = 0 

다음의 두 번째 복사본의 기간에 대한 확인 - : 사용자 ID 및 날짜, 가진 사용에 의해 그룹과 일치하는 사용자가 없는지 확인 ON 절의 테이블도 마찬가지입니다.

SELECT a.user_id, a.add_date 
FROM my_table a 
LEFT OUTER JOIN my_table b 
ON a.user_id = b.user_id 
AND a.add_date != b.add_date 
AND b.add_date between '2014-07-21' and '2014-07-22' 
WHERE a.add_date between '2014-07-21' and '2014-07-22' 
GROUP BY a.user_id, a.add_date 
HAVING COUNT(b.user_id) = 0 
0

실제로 조건은 약간 따라하기가 어렵습니다. 나는 다음과 같이 당신이 원하는 것을 할 것이라고 생각한다 :

select user_id, max(add_date) 
from my_table 
group by user_id 
having max(add_date) between '2014-07-21' and '2014-07-22' and 
     count(*) = 1; 

이것은 "날짜 조건 제외"라는 것을 의미하는 것으로 불분명하다.

관련 문제