2013-09-06 15 views
6

Ich habe Tabellen: documents, languages und document_languages. Dokumente existieren in einer oder mehreren Sprachen und diese Beziehung wird in document_languages zugeordnet.MySQL WHERE, LIMIT und Paginierung

Stellen Sie sich vor, ich möchte die Dokumente und alle Sprachen auf einer Seite anzeigen und die Ergebnismenge paginieren, um 10 Datensätze auf jeder Seite anzuzeigen. Es wird eine WHERE-Anweisung geben, die angibt, welche Sprachen abgerufen werden sollen (zB: en, fr, it).

Obwohl ich nur 10 Dokumente auf der Seite anzeigen möchte (LIMIT 10), muss ich mehr als 10 Datensätze zurückgeben, wenn ein Dokument mehr als eine Sprache hat (was die meisten tun).

Wie können Sie die WHERE-Anweisung mit der LIMIT in einer einzigen Abfrage kombinieren, um die Datensätze zu bekommen, die ich brauche?

+4

Können Sie Ihre aktuelle Abfrage (mit 10 Ergebnissen) posten? – Itay

Antwort

0

Sie können das Zählen ein wenig Zähler hinzufügen zu jeder Zeile, wie viele eindeutige Dokumente, die Sie zurückgeben, und geben Sie dann nur 10 zurück. Sie geben nur an, mit welcher Dokument-ID Sie beginnen möchten, und dann wird die nächste COM zurückgegeben 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

habe ich diese Tabellen:

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

eine grundlegende Abfrage Make GROUP_CONCAT Funktion mit der traspose von Sprachen Ergebnisse zu erhalten:

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

und setzen schließlich die Anzahl der die Dokumente mit der Option 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; 

Sie können weitere Informationen über GROUP_CONCAT hier überprüfen: http://dev.mysql.com/doc/refman/5.0/es/group-by-functions.html

0

Hmmmm ... also, wenn Sie Ihre Abfrage (SQL-Anweisung), könnte es einfacher sein, den Fehler zu erkennen. Deine äußerste LIMIT-Anweisung sollte "den Trick machen". Wie Rakesh sagte, können Sie Unterabfragen verwenden. Abhängig von Ihren Daten können Sie (wahrscheinlich) nur einfache JOINs verwenden (z. B. wo a.id = b.id ...).

Dies sollte in MySQL ziemlich einfach sein. Im unwahrscheinlichen Fall, dass Sie etwas "Phantasie" machen, können Sie die Datensätze immer in Variablen ziehen, die von einer externen Sprache (z. B. Python) analysiert werden. Für den Fall, dass Sie buchstäblich nur versuchen, die Bildschirmausgabe (interaktive Sitzung) zu begrenzen, überprüfen Sie den "Pager" -Befehl (ich mag "Pager weniger;").

Zuletzt Check-Out mit der UNION-Anweisung. Ich hoffe, dass hier etwas nützlich ist. Viel Glück!