6

我有表documentslanguagesdocument_languages。文档以一种或多种语言存在,这种关系映射到document_languages.

想象一下,现在我想在一个页面上显示文档及其所有语言,并将结果集分页以在每页上显示 10 条记录。将有一个WHERE声明,指定应检索哪些语言(例如:en、fr、it)。

即使我只想在页面上显示 10 个文档LIMIT 10

如何将WHERE语句与LIMIT单个查询结合起来以获取我需要的记录?

4

4 回答 4

1

使用子查询仅过滤文档记录

select * from 
(select * from documents limit 0,10) as doc, 
languages lan, 
document_languages dl
where doc.docid = dl.docid
and lan.langid = dl.langid

检查子查询文档

http://dev.mysql.com/doc/refman/5.0/en/from-clause-subqueries.html http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

于 2013-09-06T09:31:01.263 回答
0

嗯...所以,如果您发布查询(SQL 语句),可能更容易发现错误。您最外层的 LIMIT 语句应该“解决问题”。正如 Rakesh 所说,您可以使用子查询。但是,根据您的数据,您可能(可能)只想使用简单的 JOIN(例如 where a.id = b.id...)。

这在 MySQL 中应该相当简单。在不太可能的情况下,您正在做一些“花哨”的事情,您总是可以将数据集拉入变量中,以便由外部语言(例如 Python)解析。如果您实际上只是想限制屏幕输出(交互式会话),请查看“pager”命令(我喜欢“pager less;”)。

最后,使用 UNION 语句签出。我希望这里有一些有用的东西。祝你好运!

于 2013-10-07T21:43:08.153 回答
0

我创建了这些表:

create table documents (iddocument int, name varchar(30));
create table languages (idlang char(2), lang_name varchar(30));
create table document_languages (iddocument int, idlang char(2));

使用 GROUP_CONCAT 函数进行基本查询以获得语言结果的转置:

select d.iddocument, group_concat(dl.idlang) 
from documents d, document_languages dl 
where d.iddocument = dl.iddocument 
group by d.iddocument;

最后使用 LIMIT 选项设置文档的数量:

select d.iddocument, group_concat(dl.idlang) 
from documents d, document_languages dl 
where d.iddocument = dl.iddocument 
group by d.iddocument limit 10;

您可以在此处查看有关 GROUP_CONCAT 的更多信息:http: //dev.mysql.com/doc/refman/5.0/es/group-by-functions.html

于 2013-09-20T16:59:10.907 回答
0

您可以在每一行添加一个小计数器,计算您要返回的唯一文档的数量,然后只返回 10 个。您只需指定要从哪个 document_id 开始,然后它会返回下一个即将到来的 10 个。

SELECT document_id,
    if (@storedDocumentId <> document_id,(@docNum:=@docNum+1),@docNum), 
    @storedDocumentId:=document_id
FROM document, document_languages,(SELECT @docNum:=0) AS document_count
where @docNum<10 
    and document_id>=1234 
    and document.id=document_languages.document_id
order by document_id;
于 2013-09-06T09:41:31.953 回答