2012-07-24 4 views
0

I는 다음과 같이 크게 보이는 노드 좋아의 테이블이이 테이블 = 고유 ID그룹화 된 열로 그룹화 하시겠습니까?

lid nid uid type 
1 23 3 like 
2 23 1 like 
3 49 3 dislike 
4 11 6 like 

뚜껑, NID = "노드"(컨텐츠) ID, UID = 사용자 ID 및 유형은 자명하다 . 이 쿼리와

:

SELECT nid, COUNT(lid) AS score, type 
FROM node_likes 
INNER JOIN users ON node_likes.uid = users.uid 
GROUP BY nid, type 

나는 그것 등으로 각 노드를 얻고 점수를 싫어하는 수 있습니다. 내부 조인은 부적합합니다. 일부 사용자는 더 이상 존재하지 않는 사용자로부터 좋아하고 참여를 제거합니다.

결과는 다음과 같습니다

nid score type 
307 4  like 
307 1  dislike 
404 24 like 

어떻게 다음 하위 그룹이 type 별 검색어, 각 "와 같은"유형 (같은/싫어하는)의 최고 득점 노드 ID를 반환 할 수 있습니다?

e.

nid score type 
404 24 like 
307 1  dislike 
+0

ORDER는 당신에게 최고 꾸벅 꾸벅의를 제공 할 것입니다. 하위 그룹별로 무엇을 의미하는지 모르겠습니다 ... – Vatev

+0

ORDER BY 점수 DESC는 유형에 관계없이 가장 높은 점수를 반환합니다. 각 유형별로 가장 높은 점수를 반환하고 싶습니다. – felamaslen

+0

혼란 스럽지만, 싫어하는 부분에 대한 최고 점수가 nid = 404로되어서는 안됩니까? – ajreal

답변

2
SELECT 
    SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY likes DESC),',',1) as most_likes_nid, 
    MAX(likes) as most_likes, 
    SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY dislikes DESC),',',1) as most_dislikes_nid, 
    MAX(dislikes) as most_dislikes 
FROM (
    SELECT 
     nid, 
     COUNT(IF(type = 'like', 1, null)) as likes, 
     COUNT(IF(type = 'dislike', 1 ,null)) as dislikes 
    FROM node_likes 
    GROUP BY nid 
) as t 
+0

그것은 작동합니다. 어떻게 (아직) 모르겠지만 작동합니다. 감사! – felamaslen

+0

그것은 올바른 순서로 모든 nid를 연결 한 다음 첫 번째 것을 얻습니다. – Vatev

+0

두 번째 생각에서, 그것은 약간의 해킹처럼 보입니다. 그러나 그것은 일을합니다. – felamaslen

0
SELECT nid, COUNT(lid) AS score, type 
    FROM node_likes 
    INNER JOIN users ON node_likes.uid = users.uid 
    GROUP BY nid, type   
    ORDER BY type DESC, score DESC; 

트릭을 할 수 있습니다.

+0

점수와 유형별로 주문하지만 중간에서 불필요한 결과는 제거하지 않습니다. 즉, 최고 "좋아요"등급이없고 상위 "싫어함"nid보다 더 많은 좋아하는 게시물이있는 경우 상관없이 상위 싫어함 nid 위에 표시됩니다. – felamaslen

0

이 시도 : 점수 DESC BY

SELECT 
    nid, max(score) as score, type 
FROM (
    SELECT nid, COUNT(lid) AS score, type 
    FROM node_likes 
    INNER JOIN users ON node_likes.uid = users.uid 
    GROUP BY nid, type 
) results 
GROUP BY type 
ORDER BY type DESC, score DESC 
+0

그건 아주 이상합니다. 가장 높은 점수를 반환하지만 nids는 어떻게 든 잘못 연결됩니다. – felamaslen

+0

전혀 이상하지 않습니다. 그래서 내 솔루션에 SUBSTRING_INDEX (GROUP_CONCAT ...) 해킹을 추가했습니다. – Vatev

+0

@Vatev 당신 말이 맞아요. 양자 택일로, 나의 쿼리는'max (score)'연관을위한'nid '를 찾기위한 다른 조건을 필요로한다. –