2012-05-21 2 views
1

나는 내 게시판 만들기에 열심히 노력하고 있지만 잘 작동하지만 게시판에 게시물을 추가하고 싶습니다 (게시물 끝에있는 다이어그램).이 쿼리에 MySQL SUM() 함수를 추가하는 방법은 무엇입니까?

SELECT p.post_id, p.user_id, u.username, get_time_diff(p.date) as date, p.ip, p.text, p.parent_post_id, p.approved AS posts 
FROM msgboard_post p, msgboard_user u 
WHERE p.user_id = u.user_id 
AND p.approved = "yes" 
ORDER BY p.date DESC 
-- code for limit... 

을 그래서 지금은 세 번째 테이블, msgboard_vote 함께 일해야합니다

나는이 같은 msgboard_post msgboard_user 내 두 테이블에서 원하는 데이터를 당겼다. 모든 표는 표에서 한 행을 가져오고 그 결과에 표를 합산하여 한 표를 얻고 싶습니다. 투표 (vote_value)는 1 또는 -1이 될 수 있습니다. 투표가없는 게시물 (msgboard_vote에서 행 없음)은 결과에서 0으로 요약되는 것이 바람직하며, null도 함께 표시됩니다.

는 는

몇 시간 동안 땜질 된 는 ... /이

enter image description here

답변

1

선택한 열과 WHERE 절에서 하위 선택을 피하면 최적화 프로그램이 해당 열을 잘 처리하지 못합니다.

SELECT p.post_id, p.user_id, u.username, 
    get_time_diff(p.date) as date, p.ip, p.text, 
    p.parent_post_id, p.approved AS posts, 
IFNULL(v.vote_count, 0) AS vote_count 
FROM msgboard_user u, msgboard_post p 
LEFT JOIN 
(SELECT post_id, COUNT(*) vote_count FROM msgboard_vote GROUP BY post_id) v 
ON p.post_id = v.post_id 
WHERE p.user_id = u.user_id 
AND p.approved = "yes" 
ORDER BY p.date DESC 
+0

나를 도와 주신 Malvolio에게 감사드립니다. 정말 최고! 나는 합계가 아닌 코드 에서처럼 count (*)로 전환 할 수도 있습니다. 사용자가 부정적인 게시물에 투표하기 시작하면 사람들이 불쾌감을 느낄지 확신 할 수 없습니다. 어쩌면 최고 일 것입니다. – Marcus

+1

'count'를 사용할 수 있다면, 옵티마이 저가 인덱스 페이지에서 카운트를 계산할 수 있고 쿼리가 두 배 빠르게 실행되기 때문에해야합니다. 'SUM'을 사용한다면, 실제 값을 가져 와서 null이 아닌지 검사해야 할 수도 있습니다. – Malvolio

1

음을 :)에 크게 도움을 주셔서 감사합니다겠습니까, 나는 가장 쉬운 방법은 select 절에 일부 중첩 된 쿼리를 추가하는 것입니다 생각 , 다음과 같이하십시오 :

SELECT p.post_id, (SELECT SUM(vote_value) FROM msgboard_vote WHERE post_id = p.post_id) AS vote_count... 

당신은 그것을 시도 했나요?

+0

나는 매뉴얼을보고있다. 일부 부분은 이해가 안되는 것으로 보이고 작업 방식은 모든 항목을 보여주는 결과로 끝나지 만 투표 항목이있는 경우에만 종료됩니다. 코드에 약간의 수정을 가할 것입니다! 고마워요 :) – Marcus

+0

완벽하게 작동합니다! 다시 한 번 감사드립니다! 이제 MySQL에만 nvl()이있는 경우 ... :) – Marcus

관련 문제