【问题标题】: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 表中插入新投票之前检查两个条件:

  1. 作者的id和我传的一样吗? Posts.id_user = :author (我知道我可以通过 FK 做到这一点,但我不想)
  2. 当前用户的帐户是否处于活动状态? 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']

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 2019-08-08
        • 2012-01-11
        • 2020-02-16
        相关资源
        最近更新 更多