2014-07-22 65 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'); 

起初,我需要检查2014年7月21日之间的查询日期2014年7月22日和集团通过USER_ID,
我得到

**user_id** | **add_date** 
     100 | 2014-07-22 
     400 | 2014-07-22 
     500 | 2014-07-22 
     200 | 2014-07-21 
     300 | 2014-07-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

我知道...但只是解释english.that是它。 – 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

通过LEFT OUTER JOIN为匹配的用户标识加入表格本身,但日期不匹配。通过用户ID和日期,并具有使用组检查有没有匹配的用户: -

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 

如果你只是在重复的日期范围内,感兴趣的然后检查的第二个副本的日期范围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; 

目前还不清楚这是什么意思:“除日期条件”。

相关问题