2016-05-03 13 views
3

私はこのクエリを持っている:カンマの代わりにJOINを使用するには?

INSERT INTO Votes (id_post,id_user) 
SELECT ?,? 
    FROM Posts p, Users u 
    WHERE p.id_user = :id_author 
     AND u.id = $_SESSION['id'] 
     AND u.active = 1 
    limit 1; 

は、今私はJOINの代わり,を使用します。しかし、これらの2つの表の間に共通の列はありません。だから、私はON句で何を書きますか?今、私はVotesテーブルに新しい投票を挿入する前に2つの条件をチェックする必要があり

// Posts 
+----+----------+---------------+-----------+ 
| id | title | content | id_author | 
+----+----------+---------------+-----------+ 
| 1 | title1 | content1  | 1234  | 
| 2 | title2 | content2  | 5678  | 
+----+----------+---------------+-----------+ 
//        ^the id of post's author 

// Users 
+----+--------+--------+ 
| id | name | active | 
+----+--------+--------+ 
| 1 | jack | 1  | 
| 2 | peter | 0  | 
| 3 | John | 1  | 
+----+--------+--------+ 

// Votes 
+----+---------+---------+ 
| id | id_post | id_user | 
+----+---------+---------+ 
| 1 | 32  | 1234 | 
| 2 | 634  | 5678 | 
| 3 | 352  | 1234 | 
+----+---------+---------+ 
//    ^the id of current user 

は、私は3つのテーブルを持っている:私は何をしようとしている


  1. 著者のIDは、私が渡したものと同じですかid_authorPosts.id_user = :id_author(私はFKによってそれを行うことができると知っていますが、私は欲しくないです)
  2. 現在のユーザーのアカウントは有効ですか? Users.active = 1

サムアップ:私は人々が(active = 0アクティブでは誰に投票することはできせてはいけないしようとしています。たとえば、Stackoverflowがあなたを禁止すると、あなた(現在のユーザ)が禁止されているので、あなたは投稿にもう投票することができません。だから私は現在のユーザーを決定するためにクエリで$_SESSION['id']が使用されるべきであると確信しています。

答えて

4

私はexists代わりのjoinを使用することをお勧め:

INSERT INTO Votes (id_post, id_user) 
SELECT id_post, id_user FROM (SELECT ? id_post, ? id_user) a 
WHERE EXISTS (
    SELECT 1 FROM Users 
    WHERE id = ? 
    AND active = 1 
) AND EXISTS (
    SELECT 1 FROM posts 
    WHERE id_user = :id_author 
) 
+0

これは非常に良いです.. upvote ..しかし、不完全です(それはちょうど第2条件をチェックします)。また、この 'p.id_user =:id_author'フォームの' Posts'テーブルをチェックする必要があります。 – stack

+0

はい。これは正しいです。今、私はあなたのクエリが良いか鉱山( 'join'対' exists')か分かりません。 – stack

+0

良い答えです。 Upvote。 – e4c5

2

あなたはすでにここjoinを持っています!これは暗黙的な結合です。

内部結合と、(カンマ)条件ジョイン の非存在下での意味的に等価である:両方はつまり、最初の表の各及び全ての行が 接合されている( 指定テーブル間の直積を生成します2番目のテーブルの各行に)。

ここで、ここで参加を「紹介」する必要はありません。

+0

downvoted人はなぜ説明できますか? – e4c5

+0

説明をいただきありがとうございます。upvote – stack

+1

@stack – e4c5

関連する問題