2010-01-10 2 views
0

2 개의 테이블이 있습니다. 한 테이블은 게시물을 포함하고 다른 테이블은 게시물에 대한 투표를 포함합니다. 각 회원은 각 게시물마다 (+ 또는 -) 투표 할 수 있습니다. (구성 예 :상황에 따라 두 테이블의 데이터를 결합하는 방법은 무엇입니까?

  • 포스트 테이블 : PID 속하는, userp 텍스트.
  • 투표 테이블 : vid, userv, postid, 투표.

사용자 정보를 포함하는 하나의 표.

내가 원하는 것은 : 로그인 한 회원이라고 가정하십시오. 모든 게시물을 보여주고 싶습니다. 이미 투표 한 사람들에게 다시 투표하게하지 마십시오. (내가 투표 + 또는 무엇을 보여줘 -)가 쿼리를 많이 할 것 같은 지금 때까지 무슨 짓을

아주 나쁜 : 다음

SELECT `posts`.*, `users`.`username` 
FROM `posts`,`users` 
WHERE `posts`.belongs=$taken_from_url AND `users`.`usernumber`=`posts`.`userp` 
ORDER BY `posts`.`pid` DESC; 

과 :

foreach ($query as $result) {if (logged_in) {select vote from votes....etc} } 

그래서 로그인하면 30 개의 게시물이 표시되고 각 게시물마다 내가 투표 한 내용과 투표 한 내용을 확인하는 30 개의 쿼리가 수행됩니다. 제 질문은 JOIN (내가 생각하기에)과 어떻게 더 짧게 할 수 있을까요? (이미 시도했지만 성공하지 못했습니다.)

답변

0

먼저 로그인 한 사용자와 그렇지 않은 사용자의 출력이 크게 다를 경우 먼저 시도하지 말고 두 가지 쿼리를 사용한다고 가정 해 보겠습니다. 정말 복잡한 것을 만들어야합니다.

둘째, 이것은 당신이 원하는 같은 것을 수행해야합니다

SELECT p.*, u.username, 
    (SELECT SUM(vote) FROM votes WHERE postid = p.pid) total_votes, 
    (SELECT vote FROM votes WHERE postid = p.pid AND userv = $logged_in_user_id) my_vote 
FROM posts p 
JOIN users u ON p.userp = u.usernumber 
WHERE p.belongs = $taken_from_url 
ORDER BY p.pid DESC 

참고 : 당신은 투표 테이블의 값이 무엇인지 말을하지 않습니다. +1 (위) 또는 -1 (아래)로 가정하므로 총 투표를 쉽게 추가 할 수 있습니다. 이런 식으로하지 않으면 인생을 더 편하게 해줄 것을 제안합니다.

첫 번째 상관 된 하위 쿼리는 JOINGROUP BY을 수행하여 제거 할 수 있지만 위의 형식을 훨씬 쉽게 읽을 수 있습니다.

그래서 이것은 사용자가 게시물에 합류하는 것과 같습니다 (예 : JOIN 구문을 사용한다는 점을 제외하면 훨씬 더 쉽게 읽을 수 있습니다). 그런 다음 두 개의 하위 쿼리가 있습니다 : 첫 번째는 특정 게시물에 대한 총 투표를 발견하고 두 번째는 특정 사용자의 투표가 무엇인지 알게 :

  • 1 : 투표까지;
  • -1 : 아래로 투표;
  • NULL : 투표하지 않습니다.
+0

안녕하세요. 답변 해 주셔서 감사합니다. 예, 방문자 (로그인하지 않은 경우)에는 다른 쿼리 (더 쉽게)가 있습니다. 회원의 경우 +1을 투표하면 db에 "plus"를 저장하고 다른 단어는 "minus"를 저장합니다. 투표를하지 않은 회원에게는 아무 것도 저장하지 않습니다 (그래서 투표 할 수있는 링크가 있습니다). 나는 코드를 시험해 볼 것이고 내가 어떤 문제를 발견하면 말할 것이다. 고마워요! :) – Nick

관련 문제