假设我有以下表结构:
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中执行此操作。有什么建议吗?
答案 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