我有这个问题:
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
表之前检查两个条件:
id_author
传递的身份相同? Posts.id_user = :id_author
(我知道我可以通过FK做到这一点,但我不想要)Users.active = 1
总结:我试图让人们无法投票(active = 0
)。例如,如果Stackoverflow禁止你,那么你就不能再投票给帖子,因为你(当前用户)被禁止了。所以我很确定在查询中应该使用$_SESSION['id']
来确定当前用户。
答案 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和(逗号)在没有的情况下在语义上是等价的 连接条件:两者之间产生笛卡尔积 指定的表(即第一个表中的每一行都是 加入第二个表格中的每一行。)
因此,您无需介绍'加入这里。