2013-09-06 34 views
6

Tôi có các bảng: documents, languagesdocument_languages. Tài liệu tồn tại ở một hoặc nhiều ngôn ngữ và mối quan hệ này được ánh xạ trong document_languages.MySQL WHERE, LIMIT và pagination

Hãy tưởng tượng bây giờ tôi muốn hiển thị các tài liệu và tất cả các ngôn ngữ của nó trên một trang và phân trang tập hợp kết quả của tôi để hiển thị 10 bản ghi trên mỗi trang. Sẽ có một tuyên bố WHERE, chỉ định ngôn ngữ nào sẽ được truy xuất (ví dụ: en, fr, it).

Mặc dù tôi chỉ muốn hiển thị 10 tài liệu trên trang (LIMIT 10), tôi phải trả lại hơn 10 bản ghi nếu một tài liệu có nhiều ngôn ngữ (hầu hết là làm).

Làm cách nào bạn có thể kết hợp câu lệnh WHERE với LIMIT trong một truy vấn đơn lẻ để nhận các bản ghi mà tôi cần?

+4

Bạn có thể đăng truy vấn hiện tại của mình (với 10 kết quả) không? – Itay

Trả lời

0

Bạn có thể thêm một chút ngược lại mỗi hàng đếm có bao nhiêu các tài liệu duy nhất mà bạn đang quay trở lại và sau đó chỉ trả lại 10. Bạn chỉ cần chỉ định document_id nào sẽ bắt đầu và sau đó nó trả về com tiếp theo ing 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

Tôi tạo ra các bảng:

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

Thực hiện một truy vấn cơ bản sử dụng chức năng GROUP_CONCAT để có được những traspose ngôn ngữ kết quả:

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

Và cuối cùng đặt số các tài liệu có LIMIT tùy chọn:

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

Bạn có thể kiểm tra thêm thông tin về GROUP_CONCAT tại đây: http://dev.mysql.com/doc/refman/5.0/es/group-by-functions.html

0

Hmmmm ... vì vậy, nếu bạn đăng truy vấn (câu lệnh SQL), có thể dễ dàng phát hiện lỗi hơn. Câu lệnh LIMIT ngoài cùng của bạn nên "làm thủ thuật." Như Rakesh đã nói, bạn có thể sử dụng truy vấn phụ. Tuy nhiên, tùy thuộc vào dữ liệu của bạn, bạn có thể (có thể) chỉ muốn sử dụng các JOIN đơn giản (ví dụ: a.id = b.id ...).

Điều này khá đơn giản trong MySQL. Trong trường hợp không chắc bạn đang làm điều gì đó "ưa thích", bạn luôn có thể kéo các tập dữ liệu vào các biến được phân tích cú pháp bằng một ngôn ngữ bên ngoài (ví dụ: Python). Trong trường hợp bạn đang cố gắng giới hạn đầu ra màn hình (phiên tương tác), hãy kiểm tra lệnh "pager" (tôi thích "máy nhắn tin ít hơn;").

Cuối cùng, hãy trả phòng bằng cách sử dụng câu lệnh UNION. Tôi hy vọng rằng một cái gì đó, ở đây, là hữu ích. Chúc may mắn!

Các vấn đề liên quan