2014-01-08 1 views
1

SqlFidle here.테이블의 왼쪽 열이 어떻게 결합합니까?

MySQL의 쿼리 : 그것에서

SELECT 
      n.Type as Type, 
      n.UserIdn as UserIdn, 
      u.Username as Username, 
      n.NewsIdn as NewsIdn, 
      n.Header as Header, 
      n.Text as Text, 
      n.Tags as Tags, 
      n.ImageLink as ImageLink, 
      n.VideoLink as VideoLink, 
      n.DateCreate as DateCreate, 
      l.Uplikes as Uplikes, 
      ld.DownLikes as DownLikes 
     FROM News n 
      left join (Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up') as l ON l.NewsIdn=n.NewsIdn 
      left join (Select LikeIdn,NewsIdn,Count(*) as DownLikes FROM Likes WHERE Type='down') as ld ON ld.NewsIdn=n.NewsIdn 
      left join Users u on u.UserIdn = n.UserIdn 
      WHERE (l.Uplikes - ld.DownLikes) < 20 AND DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s') 
     ORDER BY n.DateCreate Desc LIMIT 0, 10 

쿼리 내가 l.Uplikes as Uplikesld.DownLikes as DownLikes 얻을 cannt.

제발 어떻게 말해줘?

P.S. : 행을 제거하면 (l.Uplikes - ld.DownLikes) < 20 AND 결과 쿼리에 4 행이 있습니다.

+0

SQL 피들 제공을위한 +1! – Bridge

답변

1

문제는 left outer joinlikesdislikes에 대해 NULL 값을 삽입하고 있다는 것입니다. 그래서, 0으로 변환 coalesce()를 사용

 WHERE (coalesce(l.Uplikes, 0) - coalesce(ld.DownLikes, 0)) < 20 AND 
       DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s') 

을 그건 그렇고,이 쿼리를 작성하는 방법에는 여러 가지가 있습니다. 그러나 귀하의 버전이 올바르지 않습니다. 두 하위 쿼리에서 group by NewsIdn이 필요합니다. 그렇지 않으면 전반적으로 좋아요와 싫어요가 많이 나옵니다. 그러나 두 개의 하위 쿼리도 필요 없습니다. 당신은 당신이 where 절에 UplikesDownLikes의 값을 사용하기 때문에 그것의났습니다로

FROM News n left join 
     (Select NewsIdn, sum(Type = 'up') as UpLikes, sum(Type = 'down') as dislikes 
      FROM Likes 
      group by NewsIdn 
     ) ud 
     ON ud.NewsIdn = n.NewsIdn left join 
     Users u 
     on u.UserIdn = n.UserIdn 
0

예, 당신은 필요가 없습니다 : 조건부 집계를 사용하여 likesdislikes 한 단계가 아닌 두 가지를 계산할 수 있습니다 좋아하는 테이블의 해당 행 (그래서 당신은 0이 아닌 널을 얻는다). 당신은 모두 당신의 where 절에 0 유착 (내가 당신의 선택에 생각) 당신이 반환 언급 한 네 가지 결과를 얻을 경우

:

SELECT 
     n.Type as Type, 
     n.UserIdn as UserIdn, 
     u.Username as Username, 
     n.NewsIdn as NewsIdn, 
     n.Header as Header, 
     n.Text as Text, 
     n.Tags as Tags, 
     n.ImageLink as ImageLink, 
     n.VideoLink as VideoLink, 
     n.DateCreate as DateCreate, 
     COALESCE(l.Uplikes,0) as Uplikes, 
     COALESCE(ld.DownLikes,0) as DownLikes 
    FROM News n 
     left join (Select LikeIdn,NewsIdn,Count(*) as UpLikes FROM Likes WHERE Type='up' Group by NewsIdn) as l ON l.NewsIdn=n.NewsIdn 
     left join (Select LikeIdn,NewsIdn,Count(*) as DownLikes FROM Likes WHERE Type='down' Group by NewsIdn) as ld ON ld.NewsIdn=n.NewsIdn 
     left join Users u on u.UserIdn = n.UserIdn 
     WHERE (COALESCE(l.Uplikes,0) - COALESCE(ld.DownLikes,0) < 20) AND DateCreate < STR_TO_DATE('2014-01-01 17:23:41', '%Y-%m-%d %H:%i:%s') 
    ORDER BY n.DateCreate Desc LIMIT 0, 10 

을 아니면이 있다면 쉽게 :

Sql fiddle

편집 : 하위 쿼리의 누락 된 그룹화에 대해 고든 리노프 (Gordon Linoff)에게 +1 -이를 반영하여이 답변을 업데이트했습니다.

관련 문제