mysql - 如何基于成对的列(它们本身是 SELECT 的结果)选择数据?

标签 mysql sql

假设我有如下表结构:

TABLE session
    int entity_id
    int user_id
    int status

TABLE entity_user
    int entity_id
    int user_id
    int target

session 表记录了不同用户在不同实体上的交互。 entity_user 表指定哪些用户可以访问每个实体。值得注意的是,每个用户都可以访问多个实体。

我想根据某些标准从 session 表中选择(实体,用户)对,例如。一个特定的状态。检索到这些对后,我想在 entity_user 表中为每一对查找相应的目标。

有没有办法在 SQL 中干净地执行此操作,最好是使用单个查询?

到目前为止,我的解决方案是选择对,进行一些离线文本处理以将它们连接起来(使用分隔符),然后使用该文本。因此:

SELECT entity_id, user_id FROM session WHERE status = 100;
-- Returns (101, 234), (204, 157), etc.
-- Post-process this result using # as a separator
SELECT entity_id, user_id, target FROM entity_user
  WHERE CONCAT(user_id, '#', entity_id) IN ( '101#234', '204#157', ...)

这行得通,但我觉得在 SQL 中应该有一种纯粹的方式来做到这一点。有什么建议吗?

最佳答案

可以结合子查询和连接来完成。

SELECT * FROM (
   SELECT entity_id, user_id FROM session WHERE status = 100 ) as s
LEFT JOIN entity_user ON s.entity_id = entity_user.entity_id and s.user_id = entity_user.user_id

关于mysql - 如何基于成对的列(它们本身是 SELECT 的结果)选择数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40540587/

相关文章:

mysql - 创建查询以获取未完成调用的计数

mysql - 单个表中的交集

mysql - 为父类(super class)型表强制执行单一子类型 SQL 表

sql - 在 ORACLE IN 子句中使用元组和元组中一个元素的条件

mysql - 我想将表从 SQL Server 导出到 mysql

mysql - 如果值不同则 SQL group by 留空

sql - 使用聚合函数时减少 Athena 扫描的数据量

sql - 如何在 SQLite 中转换或以宽格式选择以长格式存储的表?

php - 在多个小时内以分钟为单位的时间范围内获取 mySQL 行

sql - 删除具有在 postgreSQL 中指定的模式的表列表