【问题标题】:MySQL - exclude all blocked users from the resultsMySQL - 从结果中排除所有被阻止的用户
【发布时间】:2013-10-13 13:15:35
【问题描述】:


我对 MySQL 查询有点困惑:

我有表用户

用户 ID|语言|名称 1 |zh |迈克 2 |zh |约翰 3 |zh |杰西 4 |de |沃尔夫冈(我)

和表users_blocked

user_id|blocked_user_id 1 |4 4 |1 1 |3 3 |1 4 |2

(其中 user_id 已阻止 blocked_user_id

我想找到所有会说英语 (en) 的用户(不包括我自己),我没有屏蔽他们,他们也没有屏蔽我。 它应该只返回上例中 ID 为 3 的用户。

我正在构建一个语言合作伙伴搜索,它会从结果中排除所有被屏蔽的用户(双向)。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    来,试试看:

    select * from users where user_id <> 4 and language = 'en'
        and user_id not in(select blocked_user_id from users_blocked where user_id = 4)
        and user_id not in(select user_id from users_blocked where blocked_user_id = 4)
    

    在这里演示:http://sqlfiddle.com/#!2/b22a4/2

    【讨论】:

    • 在这个数据集上是的.. 如果你有很多记录,它不会扩展.. 检查“查看执行计划”那些 DEPENDENT SUBQUERY 和 FULL 对于可扩展性来说是个坏消息
    【解决方案2】:
    SELECT users.user_id, users.language, users.name
    FROM users
    WHERE users.language = 'EN'
      AND NOT EXISTS(SELECT * 
                     FROM users_blocked
                     WHERE (users_blocked.user_id = 4
                            AND users_blocked.blocked = users.user_id)
                       OR (users_blocked.blocked = 4
                            AND users_blocked.user_id = users.user_id)
                     )
    

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2019-08-01
      • 2013-01-31
      • 1970-01-01
      • 2019-01-16
      • 2020-02-03
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多