如何在插入前检查两个条件?
Posted
技术标签:
【中文标题】如何在插入前检查两个条件?【英文标题】:How can I check two conditions before inserting? 【发布时间】:2016-08-26 23:05:13 【问题描述】:我有三张桌子:
// Posts
+----+----------+---------------+-----------+
| id | title | content | id_author |
+----+----------+---------------+-----------+
| 1 | title1 | content1 | 1234 |
| 2 | title2 | content2 | 5678 |
+----+----------+---------------+-----------+
// 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 |
+----+---------+---------+
现在我需要在向Votes
表中插入新投票之前检查两个条件:
-
作者的id和我传的一样吗?
Posts.id_user = :author
(我知道我可以通过 FK 做到这一点,但我不想)
当前用户的帐户是否处于活动状态? Users.active = 1
这也是我的查询:
INSERT INTO Votes (id_post,id_user)
SELECT ?,?
FROM Posts p
WHERE p.id_user = :author limit 1;
如何将第二个条件 Users.active = 1
添加到我的查询中?
编辑:实际上,我试图不让不活跃的人投票(active = 0
)。例如,如果 SO 禁止男性,那么我不能再投票发布,因为我(当前用户)被禁止。所以我很确定应该在查询中使用$_SESSION['id']
。
【问题讨论】:
【参考方案1】:INSERT INTO Votes (id_post,id_user)
SELECT p.id,u.id
FROM Posts p, Users u
WHERE p.id_user = :author
AND u.id = :user
AND u.active = 1 limit 1;
然后你设置参数user
等于当前用户ID。
编辑:我认为表Votes
中的id_user
必须是选民的ID,而不是帖子的作者(对吗?),所以我修复了查询,消除了JOIN
。
【讨论】:
看,我正在尝试检查当前用户是否处于活动状态。所以我想我必须在查询中使用$_SESSION['id']
。
我已编辑查询。 author
是帖子作者,user
是当前投票者。【参考方案2】:
在哪里使用和搭配
INSERT INTO Votes (id_post,id_user)
SELECT ?,?
FROM Posts p, Users u
WHERE p.id_user = :author and u.active = 1 limit 1;
【讨论】:
【参考方案3】:INSERT INTO Votes (id_post,id_user)
SELECT p.id, u.id
FROM Posts p
INNER JOIN Users u ON 1 = 1
WHERE p.id_user = :author
AND u.id = :current_user_id
AND u.active = 1
LIMIT 1;
【讨论】:
以上是关于如何在插入前检查两个条件?的主要内容,如果未能解决你的问题,请参考以下文章