2017-03-28 1 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 

내가 가진 문제는 내가 때문에 왼쪽의 행이 가입 "복제"는군요, 난 그냥 사용자가이 있는지 알고 싶은 것입니다 활발한 관계. 사용자가 하나 이상의 활성 관계를 가지고 있더라도 상관 없습니다. 그/그녀는 적어도 하나 (적극적인 관계)가있는 경우 그 결과는 "예"여야합니다. 그가 활동적인 관계가없는 경우 (그러나 관계가있는 경우), 결과는 "만료"되어야하고 최종적으로 관계가없는 경우 결과는 "아니오"이어야합니다.

그래서, 원하는 결과가 있어야한다 : 나는 GROUP_CONCAT 기능을 얻으려고하지만 난 그것을 얻을 unabled 해요

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

. 그것이 올바른 길인지 아닌지 나는 모른다.

도움이 될 것입니다.

미리 감사드립니다.

답변

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; 

결과 : SQLFiddle 이후

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

현재 내가 그것을 추가 작동하지 않습니다 SQLize. 여기에서 일하는 참조하십시오 : http://www.sqlize.com/8cBsHBWCbN

+0

그래, 그게 내가 찾고 있던 쿼리입니다. 단순히 완벽합니다. 너무 고마워! – cooper

관련 문제