mysql - 如何使用 JOIN 而不是逗号?

标签 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 而不是 ,。但是这两个表之间没有任何公共(public)列。那么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 是否与我传递的 id_author 相同? Posts.id_user = :id_author(我知道我可以通过 FK 做到这一点,但我不想)
  2. 当前用户的帐户是否有效? Users.active = 1

总结:我试图不让不活跃的人能够投票(active = 0)。例如,如果 Stackoverflow 禁止你,那么你不能再对帖子投票,因为你(当前用户)被禁止了。所以我很确定在查询中应该使用 $_SESSION['id'] 来确定当前用户。

最佳答案

我建议使用 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
)

关于mysql - 如何使用 JOIN 而不是逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36994246/

相关文章:

mysql插入如果不存在,并发 session

mysql - 不使用索引的查询优化器

php - 将查询转换为准备好的语句

mysql - 选择用户,然后对该用户进行求和和计数

sql服务器: Column wise total SQl Query

sql - 如何找到两次之间以毫秒为单位的时间跨度?

php - 一些 Laravel 播种器没有执行任何操作 - 没有错误,但没有数据插入表中

php - 将准备好的语句与 PDO 结合使用 MySQL 查询选项

sql - 完全连接同一列上的多个表

MySQL 双连接/数据透视表