我有表格:documents
,languages
和document_languages
。文档以一种或多种语言存在,此关系映射在document_languages
。
想象一下,现在我想在页面上显示文档及其所有语言,并对我的结果集进行分页,以在每个页面上显示10条记录。将有一个WHERE
语句,指定应检索哪些语言(例如:en,fr,it)。
即使我只想在页面上显示10个文档(LIMIT 10
),如果文档有多种语言(大部分都有),我必须返回10条以上的记录。
如何在单个查询中将WHERE
语句与LIMIT
结合起来以获取我需要的记录?
答案 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语句签出。我希望这里的某些内容很有用。祝你好运!