我有一个文档权限表,我希望为用户选择一个文档页面。
事实是,可以允许用户通过多个组访问文档,因此我们可能会为用户提供超过X records for X documents
的内容。
我尝试使用子查询进行分页,但MySQL不喜欢LIMIT in the subquery
。
我面临两个主要选择:
SELECT perm.* FROM
(SELECT DISTINCT document_id FROM permissions WHERE .... LIMIT...) ids
INNER JOIN
(SELECT fields FROM permissions WHERE ....) perms
ON ids.document_id = perms.document_id
使用Java进行连接 - 首先阅读文档ID,然后在查询中使用它们:
SELECT fields FROM permissions WHERE .... AND document_id IN([specific document_ids previously read])
什么会更有效?
答案 0 :(得分:1)
您的问题中有一些不同的问题。首先:
1:我真的不明白你在查询中做了什么,但是limit子句必须在查询的末尾,所以你可以试试
select * from A join B on A.id = B.id limit 10
这应该有效。更多信息:
https://dev.mysql.com/doc/refman/5.0/en/select.html
2:Join vs. IN子句:IN子句应该总是比连接更差。想象一下:
select * from A where A.id in (select id from B)
这将对B表(select id from B
子查询)进行全面扫描,然后对A进行另一次完整扫描以尝试匹配结果。
然而,
select * from A join B on A.id = B.id
应该在两个表之间进行散列连接,如果你已经计划好了,id将是一个索引列,所以它应该更快(并且不对它们都没有完全扫描)