2013-09-06 21 views
6

Mam tabele: documents, languages i document_languages. Dokumenty istnieją w jednym lub kilku językach i ta relacja jest odwzorowywana w document_languages.MySQL WHERE, LIMIT i paginacja

Wyobraź sobie teraz, że chcę wyświetlić dokumenty i wszystkie ich języki na stronie, a następnie umieścić w paginacji mój zestaw wyników, aby wyświetlić 10 rekordów na każdej stronie. Pojawi się instrukcja WHERE, określająca, które języki mają być pobrane (np. En, fr, it).

Mimo że chcę wyświetlić tylko 10 dokumentów na stronie (LIMIT 10), muszę zwrócić więcej niż 10 rekordów, jeśli dokument ma więcej niż jeden język (co większość robi).

Jak można połączyć oświadczenie WHERE z LIMIT w jednym zapytaniu, aby uzyskać potrzebne rekordy?

+4

Czy możesz zamieścić swoje aktualne zapytanie (z 10 wynikami)? – Itay

Odpowiedz

0

Można dodać trochę licznik na każdym rzędzie licząc ile Unikalne dokumenty, które wracasz, a następnie zwracają tylko 10. Po prostu określ, na jaki identyfikator document_id ma się zaczynać, a następnie zwraca następną komendę 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

stworzyłem te tabele:

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

Zrób podstawowej kwerendy przy użyciu funkcji GROUP_CONCAT uzyskanie traspose języków wyników:

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

I wreszcie ustawić liczbę dokumenty z opcją 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; 

Możesz sprawdzić więcej informacji o GROUP_CONCAT tutaj: http://dev.mysql.com/doc/refman/5.0/es/group-by-functions.html

0

Hmmmm ... więc, jeśli zamieścisz zapytanie (instrukcja SQL), łatwiej będzie zauważyć błąd. Twoja zewnętrzna instrukcja LIMIT powinna "załatwić sprawę". Jak powiedział Rakesh, możesz użyć podkwerend. Jednak w zależności od twoich danych możesz (prawdopodobnie) po prostu chcieć użyć prostych JOINów (np. Gdzie a.id = b.id ...).

To powinno być dość proste w MySQL. W mało prawdopodobnym przypadku, gdy robisz coś "wymyślnego", zawsze możesz przeciągnąć zestawy danych do zmiennych, które będą analizowane przez język zewnętrzny (np. Python). W przypadku, gdy dosłownie próbujesz ograniczyć wyświetlanie ekranu (sesja interaktywna), sprawdź polecenie "pager" (lubię "pager less;").

Wreszcie, check-out za pomocą instrukcji UNION. Mam nadzieję, że coś tu jest użyteczne. Powodzenia!