如何根据列对(它们本身是SELECT的结果)选择数据?

时间:2016-11-11 03:16:17

标签: 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中执行此操作。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以在MySQL中使用template <class K, class T, class H = boost::hash<K>, class P = std::equal_to<K>, class A = std::allocator<std::pair<const K, T> > > class unordered_map; 对:

IN

为了提高性能,我建议在SELECT entity_id, user_id, target FROM entity_user WHERE (user_id, entity_id) IN (SELECT user_id, entity_id FROM session WHERE status = 100); 上建立一个索引。您还可以使用session(session, entity_id, user_id)

join

为此,SELECT eu.entity_id, eu.user_id, eu.target FROM entity_user eu JOIN session s USING (user_id, entity_id) WHERE s.status = 100; session(status, user_id, entity_id)上的索引很有用。

答案 1 :(得分:1)

可以使用子查询和连接的组合来完成。

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