2013-09-06 63 views
6

私はテーブル:documents,languagesおよびdocument_languagesを持っています。ドキュメントは1つ以上の言語で存在し、この関係はdocument_languagesにマッピングされています。MySQLのWHERE、LIMITおよびページ番号

ドキュメントとその言語をすべてページに表示し、結果セットにページを設定して各ページに10個のレコードを表示するとします。 WHEREステートメントがあり、取得する言語を指定します(例:en、fr、it)。

文書には10個の文書しか表示したくないのに(LIMIT 10)、文書に複数の言語がある場合は、10個以上のレコードを返さなければなりません。

LIMITLIMITの文を1つのクエリで組み合わせて、必要なレコードを取得するにはどうすればよいですか?

+4

あなたは現在のクエリを(10件の結果を)投稿できますか? – Itay

答えて

0

あなたはどのように多くを数え、各行にはほとんどカウンターを追加することができますあなたが戻ってきたユニークなドキュメントを返してから10に戻ります。あなたはどのdocument_idで始まるかを指定して、次のcomを返します。 10.

SELECT document_id, 
    if (@storedDocumentId <> document_id,(@docNum:[email protected]+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; 
0

をINGの私は、これらのテーブルを作成しました:

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)); 

は言語結果のtrasposeを得るために、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

0

Hmmmm ...だから、クエリ(SQL文)を投稿すると、エラーを見つけやすくなります。一番外側のLIMITステートメントは「やってみる」べきです。 Rakesh氏によると、サブクエリを使用することができます。ただし、データによっては、単純なJOIN(例:a.id = b.id ...など)を使用したい(おそらく)かもしれません。

これはMySQLでかなり簡単です。 「ファンシー」な何かをしているような場合は、常にデータセットを変数に変換して外部言語(Pythonなど)で解析することができます。文字通り画面出力(対話セッション)を制限しようとしている場合は、「ページャ」コマンドをチェックアウトします(「ページャレス」が好きです)。

最後に、UNION文を使用してチェックアウトします。私はここで何かが役に立つことを願っています。がんばろう!