2016-05-10 40 views
1

ich die folgende SQL-Abfrage habe und ich versuche, Paginierung zu implementieren, so möchte ich zunächst die COUNT des Ergebnisses erhalten:korrekte Syntax für COUNT (DISTINCT ...)

Die normale Abfrage (funktioniert)

SELECT DISTINCT c.*, p1.*, username FROM candidate c 
LEFT JOIN note p1 ON (c.candID = p1.candidateID) 
LEFT JOIN user ON p1.userID = user.id 
LEFT OUTER JOIN note p2 ON 
(c.candID = p2.candidateID AND (p1.noteID < p2.noteID)) 
WHERE p2.candidateID IS NULL ORDER BY c.firstname ASC 

ich folgendes versucht haben, aber es wirft einen Fehler und ich bin nicht sicher, was die korrekte Syntax zu verwenden:

der Versuch, die Ergebnisse zu zählen (nicht Arbeit)

SELECT COUNT(DISTINCT c.*, p1.*, username) FROM candidate c 
LEFT JOIN note p1 ON (c.candID = p1.candidateID) 
LEFT JOIN user ON p1.userID = user.id 
LEFT OUTER JOIN note p2 ON 
(c.candID = p2.candidateID AND (p1.noteID < p2.noteID)) 
WHERE p2.candidateID IS NULL ORDER BY c.firstname ASC 

Der Fehler:

Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax in der Nähe von ', p1 zu verwenden. , username) FROM Kandidat c LINKS 'at line 1

+0

hinzugefügt den Fehler, ich bin zuerst bekommen die Anzahl zu bestimmen, wie viele Seiten die Ergebnisse zu verbreiten, scheint dies ziemlich normal zu sein siehe: http://StackOverflow.com/Questions/818567/Mysql-Pagination-without -double-querying – dlofrodloh

+0

Die oben gewählte Antwort an Ihrem Link zeigt an, dass dies nicht der richtige Weg ist. Es führt die Abfrage zweimal unnötigerweise aus. Verwenden Sie die Klausel 'LIMIT', um die Paginierung ordnungsgemäß zu unterstützen. –

+0

Diese Antwort ist schön und einfach, aber ich brauche auch die Anzahl der Seiten und eine Zahl, wie viele Ergebnisse es gibt, nicht nur eine nächste Schaltfläche – dlofrodloh

Antwort

2

Eine Option ist eine Unterabfrage verwenden:

SELECT COUNT(*) 
FROM (
    SELECT DISTINCT c.*, p1.*, username FROM candidate c 
    LEFT JOIN note p1 ON (c.candID = p1.candidateID) 
    LEFT JOIN user ON p1.userID = user.id 
    LEFT OUTER JOIN note p2 ON 
    (c.candID = p2.candidateID AND (p1.noteID < p2.noteID)) 
    WHERE p2.candidateID IS NULL 
) t 

auf Ihre Daten je, können Sie sein, dies ohne die Unterabfrage tun, aber Sie kann nicht mehrere Spalten mit dem count Aggregat verwenden - das verursacht Ihren Fehler.

+0

Wissen Sie, warum ich den Fehler "Doppelter Spaltenname 'userID'" bekomme, wenn Sie dies in eine Unterabfrage umwandeln? – dlofrodloh

+0

@ dlofrodloh - Wahrscheinlich haben sowohl die Kandidatentabelle als auch die Notizentabellen ein 'userId'-Feld. Die Unterabfrage kann nicht bestimmen, welche zu verwenden ist, daher der Fehler. Sie müssten alle Spaltennamen auflisten und aliasieren. Sie benötigen wahrscheinlich nur die Spalten, die einen eindeutigen Satz definieren. – sgeddes

+0

Aha, großer Dank ... Ich brauchte natürlich nicht alle Spalten für die Zählung, also habe ich die Asterixe einfach durch einzigartige Spalten ersetzt und es hat funktioniert – dlofrodloh