2017-03-28 107 views
0

也許標題不是最好的,但我不知道如何用幾句話來解釋它。mysql左連接沒有重複行

我有兩個表是這樣的:

表 「用戶」

id|name 
--+--------+ 
1 |Alice | 
2 |Bob  | 
3 |Charlie | 

表 「article_users」

user_id|article_id|expired_date 
-------+----------+------------+ 
    1 | 1  |01-01-2016 
    1 | 5  |01-01-2018 
    3 | 1  |01-01-2016 

我需要獲得所有用戶,並知道他們是否有一個文章關係,獲取它是否過期以防他們有這種關係。

我不需要知道哪篇文章已過期。我的意思是,如果一個用戶的關係沒有過期(至少)一篇文章,答案應該是:「是的,他/她有一個積極的關係」。

我工作的查詢是:

SELECT u.*, IF(TIMEDIFF(expired_date,CURDATE())<0,'YES',IF(TIMEDIFF(expired_date,CURDATE())>0,'EXPIRED','NO')) relation 
FROM users u 
LEFT JOIN article_users au ON au.user_id = u.id 

我的問題是,我得到「複製」因爲左行JOIN,我只是想知道,如果用戶擁有一個積極的關係。我的意思是,不管用戶是否有一個或多個活躍的關係。如果他/她至少有一個(主動關係),那麼結果應該是「是」。如果他沒有積極的關係(但他/她有關係),結果應該是「過期」,最後如果他/她沒有關係,結果應該是「不」。

所以,理想的結果應該是:

id|name |relation 
--+--------+-------- 
1|Alice | YES  
2|Bob  | NO 
3|Charlie | EXPIRED  

我試圖用GROUP_CONCAT函數來得到它,但我unabled得到它。我不知道這是否正確。

任何幫助將非常感激。

在此先感謝。

回答

1

試試這個方法:

設置:

create table users(
    id integer, 
    name varchar(15) 
); 

create table article_users (
    user_id integer, 
    article_id integer, 
expired_date date 
); 

insert into users values (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'); 
insert into article_users values (1, 1, '2016-01-01'), 
       (1, 2, '2018-01-01'), (3, 1, '2016-01-01'); 

查詢:

select u.name, 
     case when a.qtd>0 then 'Yes' 
      when a.qtd=0 then 'Expired' 
      else 'No' end as relation 
    from users u 
     left join 
     (select user_id, 
       sum(if(timediff(expired_date, curdate())>0, 1, 0)) qtd 
      from article_users 
      group by user_id) a on u.id = a.user_id 
order by u.name; 

結果:

name  relation 
------------------ 
Alice Yes 
Bob  No 
Charlie Expired 

由於SQLFiddle當前沒有工作,我加入它SQLize。看到它在這裏工作:http://www.sqlize.com/8cBsHBWCbN

+0

是的,這就是我正在尋找的查詢。簡單完美。非常感謝! – cooper