2016-06-25 7 views
2

私はPHP投票システムに取り組んでいます。ログインしたユーザーをチェックして、投稿に投票し、ユーザーが投票した場合は投票します。私は複数のquiresを使用せずに1つのクエリでそれをしたいと思います。 投稿テーブルログインしてい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 

これらの2つのクエリを組み合わせる方法はありますか?

<?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 active = 1 AND ORDER BY P.post_id DESC'を' WHERE P. active = 1 ORDER BY P.post_id DESC'に変更してください。ありがとうございました – Jordyn

0

あなたは投票表などのような投稿表の両方に共通のフィールドを対象に参加使用することができます実際に投票を抽出してグループ化します。だから、基本的に私たちが何をしよう、部分的に2つのテーブルを結合し、多分あなたは、私がしている重複があった場合に

0

あなたが列に配列として票を選択することはできませんが、次のことができます。

1

を投票ですべてのスコアを合計してることを見ることができ、すべての票

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 

を合計でありますLEFT JOIN voteテーブル(ヌルジョインをしたくない場合は、left join categoryも必要ありません)。ユーザーが投票した場合は、結合された列に値があります。それ以外の場合は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