2009-12-02 3 views
0

그래서이 링크는 내 링크와 투표 테이블에서 가져오고 마지막 데이터 열이 하나 필요합니다. 내 투표 테이블은 모든 사용자의 투표로 구성되며 사용자는 링크 당 한 번만 투표 할 수 있으며 투표 값은 -1, 0 또는 1입니다. 투표 테이블에 user_id 외래 키가 있으며 현재 사용자의 투표를 수집하려고합니다. . 현재 쿼리의 복잡성으로 인해 두 번째 쿼리가 필요할 수도 있지만 가능한 경우이를 피하고 싶습니다. 나는 현재 로그인 한 사용자의 투표가 무엇인지 알 필요가 있습니다. 사용자는 링크에 한 번만 투표 할 수 있기 때문에 링크에는 투표 값이 두 개 이상 없습니다.MySQL : 링크 쿼리에서 현재 사용자 투표하기

몇 가지 참고 사항

  1. 모든 링크가 링크에 투표 사용자는 그 투표가와 그 투표 항목을 유지할 선택 해제
  2. 현재 사용자가 적어도 하나 개의 투표 항목과 자동으로 시작 0 델타

SQL :

SELECT links.*, (SUM(votes.karma_delta)) AS karma 
FROM links, votes 
WHERE links.id = votes.link_id 
GROUP BY votes.link_id 
ORDER BY (SUM(votes.karma_delta) - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC 
LIMIT 0, 100 

최적화가 훌륭하지만, 지금은 지정된 사용자가 선택한 링크 karma_delta를 얻고 싶습니다.

+0

을 나는 – Franz

답변

0

나는 당신이 묻는 것을 정말로 모르지만, 이미 돌아온 정보를 유지하고 각 링크에 대한 현재 사용자와 관련된 투표의 합계로 간단히 증가시키는 것처럼 들린다. 그런 경우

,이 같은 뭔가를 수행해야합니다

SELECT links.*, 
     SUM(votes.karma_delta) AS karma, 
     SUM(
      IF(votes.user_id = current_user_id, 
       votes.karma_delta, 
       0) 
     ) AS user_vote 
FROM links, votes 
WHERE links.id = votes.link_id 
GROUP BY votes.link_id 
ORDER BY (SUM(votes.karma_delta) - 1)/
     POW(
       TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2, 
       1.5 
      ) DESC 
LIMIT 0, 100 
+0

나는 너를 충분히 칭찬 할 수 없다! 이것은 내가 필요한 것입니다! –

+0

존재하지 않는 투표를 0으로 작성하는 것도 완벽합니다! 이것은 단지 천재입니다! –

0

이렇게 빨리 만들 수있는 방법 중 하나입니다. 각 링크의 점수를 자주 표시해야하는 경우 링크를 자주 선택하지 않으면 데이터 구조가 다음과 같이 비정규 화됩니다. 혹시 동기화 점점이 걱정하는 경우

  • 당신이 투표 테이블에 수정을 할 때마다 "현재 점수"
  • 라는 링크 테이블에 열을 생성, 또한 현재 점수
  • 를 업데이트 현재 스코어의 값을 "모든 투표의 집계"로 대체하는 데몬을 실행하십시오.

그런 다음 각 링크의 점수를 보여주는 것은 메가 패스트입니다. 물론, 여기에서 지불하는 비용은 투표 시간 (한 번에 두 번 삽입/업데이트를하는 것)과 약간의 복잡성에 있습니다.

+0

... 그 빨라집니다 때문에, 일반이 대신 WHERE 절의 ON 절에 JOIN 구문을 사용하는 것이 좋습니다 나는 언젠가 내 사이트가 내가 실제로 이것을해야만하는 곳에서 충분히 인기가있을 것이라는 희망을 가지고있다. –

관련 문제