MySQL子查询变量传递

标签 mysql variables scope subquery

表:用户(id INT,名字 VARCHAR)

表:黑名单(id INT,userid INT,blocked_userid INT)

SELECT user.id theID, user.firstname
FROM user
WHERE
NOT user.id = 1000
AND IF ((SELECT id FROM blocklist WHERE theID = ANY (SELECT blocked_userid FROM blocklist WHERE userid = 1000)), 0, (IF ((1000 = ANY (SELECT userid FROM blocklist WHERE blocked_userid = theID)),0,1)))

我想返回所有用户的列表,而不是当前用户,比如...用户 1000,该用户未被该用户阻止或不在其他用户的阻止列表中。因此这是一个双向系统……你看不到你屏蔽的人,你可以看到屏蔽你的人。问题是,我不能很好地在子查询中使用“theID”。解决这个问题的最佳方法是什么?

最佳答案

好的,根据示例数据,我认为可以这样做:

SELECT u.id, u.firstname, b1.id, b2.id
FROM user AS u
JOIN user myUser ON myUser.id = 2
LEFT JOIN blocklist b1 ON u.id = b1.userid AND b1.blocked_userid = myUser.id
LEFT JOIN blocklist b2 ON u.id = b2.blocked_userid AND b2.userid = myUser.id
WHERE u.id != myUser.id
HAVING b1.id IS NULL AND b2.id IS NULL

如果你真的需要去掉 b1.id 和 b2.id 这两个额外的列:

SELECT t.theId, t.firstname FROM
       (SELECT u.id as theID, u.firstname, b1.id as b1, b2.id as b2
       FROM user AS u
       JOIN user myUser ON myUser.id = 2
       LEFT JOIN blocklist b1 ON u.id = b1.userid AND b1.blocked_userid = myUser.id
       LEFT JOIN blocklist b2 ON u.id = b2.blocked_userid AND b2.userid = myUser.id
       WHERE u.id != myUser.id
HAVING b1.id IS NULL AND b2.id IS NULL) as t

关于MySQL子查询变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5762434/

相关文章:

mysql - 存储过程中的变量

python - Python 中的对象创建 - 修改后的变量会发生什么?

JavaScript:将函数存储在对象中,但在本地上下文中执行它

c++ - 作为参数传递给函数(c++)时如何修改全局结构?

javascript - 在包含的前端 js 文件中使用服务器生成的变量

functional-programming - 将模块及其实例作为 OCaml 函数的参数

c# - MySql数据库中如何调用多个存储过程

php - 如何从已知和未知作者的帖子表中获取帖子

java - Hibernate 中不必要的查询 - MySql

java - 访问 Websphere 6.1 变量