MySQL WHERE,LIMIT和分页

时间:2013-09-06 09:01:21

标签: mysql

我有表格:documentslanguagesdocument_languages。文档以一种或多种语言存在,此关系映射在document_languages

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

即使我只想在页面上显示10个文档(LIMIT 10),如果文档有多种语言(大部分都有),我必须返回10条以上的记录。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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函数进行基本查询以获得语言结果的traspose:

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

答案 3 :(得分:0)

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

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

最后,使用UNION语句签出。我希望这里的某些内容很有用。祝你好运!