2016-05-03 3 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 вместо ,. Но между этими двумя таблицами нет общего столбца. Итак, что я должен писать в статье ON?


То, что я пытаюсь сделать:

У меня есть три таблицы:

// 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 

Теперь мне нужно проверить два условия, прежде чем вставить новый голос в Votes таблицы:

  1. Является ли идентификатор автора таким же, как то, что я передаю как id_author? Posts.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 .. но неполный (он просто проверяет второе условие). Мне также нужно проверить таблицу 'Posts'' 'p.id_user =: id_author'. – stack

+0

Да .. это правильно сейчас .. теперь я не знаю, что ваш запрос лучше или мой ('join' vs' exists') – stack

+0

хороший ответ. Upvote. – e4c5

2

У вас уже есть join здесь! Это неявное соединение.

INNER JOIN и, (запятая) семантически эквивалентны при отсутствии условие соединения: оба производят декартово произведение между указанных таблиц (то есть, каждый и каждая строка в первой таблице присоединился к каждой строке во второй таблице).

Так что вам не нужно «вводить» соединение здесь.

+0

Может ли человек, который downvoted, объяснить, почему? – e4c5

+0

Спасибо за ваши пояснения .. upvote – stack

+1

Спасибо @stack – e4c5

Смежные вопросы