2016-06-25 2 views
2

PHP 투표 시스템에서 작업 중이며 로그인 한 사용자가 게시물에 투표하고 사용자가 투표 한 경우 투표를 표시하고 싶습니다. 여러 quires 사용하지 않고 하나의 단일 쿼리에서 그것을하고 싶습니다. 게시물 테이블PHP 투표 시스템 체크 투표

+---------+--------+--------+ 
| post_id | title | c_id | 
+---------+--------+--------+ 
|  1 | post 1 | 2 | 
|  2 | post 2 | 3 | 
|  3 | post 3 | 2 | 
|  4 | post 4 | 1 | 
+---------+--------+--------+ 

MySQL의 루프

SELECT * 
    FROM posts 
    LEFT 
    JOIN categories 
    ON categories.cat_id = posts.c_id 
WHERE posts.c_id = categories.cat_id 
    AND posts. active = 1 
ORDER 
    BY posts.post_id DESC 
LIMIT 0, 10 

투표 테이블

+---------+--------+---------+ 
| vote_id | p_id | u_id | 
+---------+--------+---------+ 
|  1 | 1 | 1  | 
|  2 | 2 | 1  | 
|  3 | 2 | 2  | 
|  4 | 4 | 1  | 
+---------+--------+---------+ 

내가 내부 쿼리를 실행하면 $uid 그래서 MySQL의 루프 위가 잘 작동 = 사용자가 로그인 한

SELECT * FROM votes WHERE u_id = $uid AND p_id= $post_id 

이 두 쿼리를 결합하는 방법이 있습니까?

<?php 
     $sql = "SELECT * FROM votes AS V LEFT JOIN posts AS P ON V.p_id=P.post_id 
       WHERE (V.u_id={$uid} AND V.p_id={$post_id}) GROUP BY V.u_id"; 

답변

3
SELECT * 
    FROM posts P 
    LEFT 
    JOIN categories C 
    ON C.cat_id = P.c_id 
    LEFT JOIN (SELECT p_id FROM votes WHERE u_id = $uid) V 
    ON V.p_id=P.post_id 
    WHERE P. active = 1 
ORDER 
    BY P.post_id DESC 
LIMIT 0, 10 ; 
+0

이 작품은 투표 한 게시물 만 표시합니다. 투표 한 표가 표시되지 않습니다. – Jordyn

+0

@Jordyn 업데이트 된 쿼리 –

+0

을 확인하십시오. 'WHERE P. 활성 = 1 AND ORDER BY P.post_id DESC'를'WHERE P. active = 1 ORDER BY P.post_id DESC'로 변경해야합니다. 고맙습니다. – Jordyn

0

당신은이 투표 표 등 같은 게시물 표 모두에서 공통 필드를 대상으로 가입 사용할 수 있습니다 실제로 투표를 추출하고 그룹화합니다. 그래서 기본적으로 우리가 무엇을 할 거 야 모든 투표

SELECT p.*, c.*, sum(v.Score) FROM posts p LEFT JOIN categories c ON c.cat_id = p.c_id LEFT JOIN votes v ON p.post_id = v.p_id WHERE p.active = 1 AND v.u_id = $uid GROUP BY p.post_id ORDER BY p.post_id DESC LIMIT 0, 10 

당신은 내가 거기 경우에있어 중복

0

당신은 열에 배열로 투표를 선택할 수 없습니다하지만 당신은 할 수 있습니다

1

을 투표의 모든 점수를 합산하고있어 것을 알 수 있습니다 합계 어쩌면 부분적으로 두 개의 테이블을 조인하고있다 LEFT JOIN vote 테이블 (널 조인을 원하지 않으면 왼쪽 조인 카테고리 필요 없음). 사용자가 투표 한 경우 조인 된 열에 값이 있습니다. 그렇지 않은 경우 null이 결합됩니다.

SELECT * 
FROM posts AS p 
INNER JOIN categories AS c ON c.cat_id = p.c_id 
LEFT JOIN votes AS v ON p.post_id = v.p_id AND v.u_id = $uid 
WHERE p.active = 1 
ORDER BY p.post_id DESC 
LIMIT 0, 10 

되지 투표 후 투표 컬럼에 널 (null)을 가지고 있지만, 당신이 원하는 이후에만 알 사용자는 출력 데이터는 콘크리트 필드를 지정 (필요한 부분 만 얻을)와 1을 반환 voted 열을 제한 할 수 있습니다 투표를 한 경우/0 값만 :

SELECT p.*, c.title, ..., IF(v.vote_id; 1; 0) AS voted