2014-08-28 2 views
0

계정, 게시물 및 사용자가 좋아하는 게시물에 대한 정보를 보유하고있는 데이터베이스가 있습니다.하나의 열을 두 개의 테이블에 결합하십시오.

AccountData 
id || username 

PostData 
id || text || accountid 

LikesDislikesData 
liked(bool) || accountid || postid 

DB에서 특정 데이터가 필요하므로보기가 설정되어 있습니다.

SELECT trippin.PostData.id, trippin.AccountData.username, trippin.PostData.posttext,  
    trippin.CategoryData.categoryname, trippin.PostData.__createdat as CreatedAt, 
    SUM(CASE WHEN likes.liked = 1 THEN 1 ELSE 0 END) as Likes, 
    SUM(CASE WHEN likes.liked = 0 THEN 1 ELSE 0 END) as DisLikes 
FROM trippin.PostData  
INNER JOIN trippin.AccountData ON trippin.PostData.accountid = trippin.AccountData.id 
INNER JOIN trippin.CategoryData ON trippin.CategoryData.id = trippin.PostData.categoryid 
LEFT OUTER JOIN trippin.LikesDislikesData likes ON likes.postid = trippin.PostData.id 
GROUP BY (trippin.AccountData.username), (trippin.PostData.posttext), (trippin.PostData.id), (trippin.categorydata.categoryname), (trippin.PostData.__createdat) 

문제는 내가 추가 한 시간이 (likes.accountid = trippin.AccountData.id), 행이 중 중복 또는 출력 그냥 잘못되는 조인 있다는 것입니다 : 여기에 내가 사용하고있는 코드입니다.

디자인 문제 일지 모르지만 확실하지 않고 정확한 문제를 해결하는 데 도움이되는 것을 찾을 수 없습니다.

기본적으로 각 게시물은 사용자가 만듭니다. 그런 다음 각 게시물은 다른 사용자가 좋아하거나 싫어하는 항목입니다. 내 애플 리케이션에 전달할 수 있도록보기 내부에이 모든 데이터가 필요합니다.

+1

LikesDislikesData = 하나 또는 싫어하는 것 중 하나의 행을 가정하고 있습니다 ... 그래서 주어진 postID에 대해이 테이블에 많은 행이 있습니까? 이것이 올바른 가정이고 방금 좋아하는 것을 얻으려는 경우 LikesDislikesData의 subselect에 가입하여 accountID별로 개수 및 그룹을 만듭니다 (따라서 하나의 accountID 당 하나의 행을 부여 함) – Twelfth

+1

어떤 데이터를 선택 하시겠습니까? ? 당신의 결과에서 하나의 행이 하나 같이/싫어하는가? 또는 좋아하는 사람이없는 모든 게시물을 선택 하시겠습니까? – Koryu

+0

모든 게시물을 원합니다. 나는 또한 얼마나 많은 likes (좋아 = true)와 싫어하는 (좋아 = false) 각 게시물의 수를 가지고 열 싶어요. 아마 내가 잘못 생각하고 있습니다. 그래서 예, 나는 같은 추측을 한 번 이상 가질 것입니다. 그것을 할 다른 방법이 있습니까? – user3007447

답변

1
select postID 
    , sum(case when liked = true then 1 else 0 end) as liked 
    , sum(case when liked = true then 1 else 0 end) as disliked 
from trippin.LikesDislikesData 
group by postID 

위의 진술은 게시물 ID로 좋아요와 싫어요를 제공해야합니다. 하위 쿼리라고 부르며 본관에 가입하십시오.

SELECT trippin.PostData.id, trippin.AccountData.username, trippin.PostData.posttext,  
trippin.CategoryData.categoryname, trippin.PostData.__createdat as CreatedAt, 
Likes, 
DisLikes 
FROM trippin.PostData  
INNER JOIN trippin.AccountData ON trippin.PostData.accountid = trippin.AccountData.id 
INNER JOIN trippin.CategoryData ON trippin.CategoryData.id = trippin.PostData.categoryid 
LEFT OUTER JOIN (
    select postID 
    , sum(case when liked = true then 1 else 0 end) as liked 
    , sum(case when liked = true then 1 else 0 end) as disliked 
from trippin.LikesDislikesData 
group by postID) 
likes ON likes.postid = trippin.PostData.id 

이후의 작업에 적합해야합니다. 더 이상 합계 구문이 필요하지 않으므로 group by 절을 제거했습니다. 매우 자주 당신은 ID로 카운트와 합계를 수행하는 하위 쿼리를 만들고 그 ID로 메인 쿼리에 합류하면 카운트를 얻는 가장 쉬운 솔루션이 될 것입니다 ... 전체 select 문으로 그룹화하지 않고도 최소한

+0

감사합니다. 그러나 나는 더 깊은 문제가 있다고 생각한다. 설명해 드리겠습니다. 게시물 데이터가 중복 될 수 없습니다. 이 정보를 C#의 객체에 전달하고 있습니다. 중복 게시물이 있으면 작동하지 않으므로 C#에서 디자인을 확인하거나 구현을 확인해야한다고 생각합니다. 그래도 도움을 주셔서 감사합니다. – user3007447

관련 문제