如何使用JOIN而不是逗号?

时间:2016-05-03 01:39:20

标签: mysql sql

我有这个问题:

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
  3. 总结:我试图让人们无法投票active = 0。例如,如果Stackoverflow禁止你,那么你就不能再投票给帖子,因为你(当前用户)被禁止了。所以我很确定在查询中应该使用$_SESSION['id']来确定当前用户。

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:2)

你这里已经有join了!这是一个隐式连接。

  

INNER JOIN和(逗号)在没有的情况下在语义上是等价的   连接条件:两者之间产生笛卡尔积   指定的表(即第一个表中的每一行都是   加入第二个表格中的每一行。)

因此,您无需介绍'加入这里。