2016-07-20 9 views
2

Mit der Abfrage unten kann ich nach Eigenschaften innerhalb eines bestimmten Radius suchen und die Ergebnisse werden zurückgegeben.MySQL - COUNT() verwenden, um Gesamtergebnisse zurückzugeben, wenn HAVING angegeben wird

SELECT id, address, (3959 * acos(cos(radians(53.184815)) * cos(radians(lat)) * cos(radians(lng) - radians(-3.025741)) + sin(radians(53.184815)) * sin(radians(lat)))) AS distance 
FROM properties 
WHERE area = 1 HAVING distance <= 1 
ORDER BY price DESC, distance ASC 
LIMIT 0, 10 

aber ich will jetzt Paginierung hinzufügen, damit die „LIMIT 0, 10“, aber irgendwie haben die Abfrage die Gesamt Ergebnisse zurück. Wenn es beispielsweise 100 Ergebnisse gibt, die aber nur auf die ersten 10 Ergebnisse beschränkt sind, geben Sie die Summe als 100 zurück.

Ich habe versucht, "COUNT (*) AS total" nach der Auswahl hinzuzufügen, aber dies führte zu null Ergebnissen zurück.

Wie kann ich die Abfrage den Gesamtbetrag auf diese Weise zurückgeben?

+0

SQL_CALC_FOUND_ROWS und nach SELECT FOUND_ROWS(); – splash58

+0

SQL_CALC_FOUND_ROWS ist anscheinend bis zu 10 mal langsamer: http://stackoverflow.com/questions/186588/which-is-fastest-select-sql-calc-found-rows-from-table-or-select-count – Reado

+0

Gesamt bedeutet , die Anzahl der Zeilen oder die Gesamteigenschaft als Anzahl? – Avishake

Antwort

2

ich denke, es wird eine Unterabfrage muß das erreichen:

SELECT 
    id, address, (3959 * acos(cos(radians(53.184815)) * cos(radians(lat)) * cos(radians(lng) - radians(-3.025741)) + sin(radians(53.184815)) * sin(radians(lat)))) AS distance, 
    (SELECT count(*) FROM properties WHERE area = 1 HAVING (3959 * acos(cos(radians(53.184815)) * cos(radians(lat)) * cos(radians(lng) - radians(-3.025741)) + sin(radians(53.184815)) * sin(radians(lat))))<= 1) AS total 
FROM properties 
WHERE area = 1 HAVING distance <= 1 
ORDER BY price DESC, distance ASC 
LIMIT 0, 10 
1

Sie haben entweder eine separate Abfrage ohne Limit mit count (*) verwenden oder als Spritz angegeben, verwenden SQL_CALC_FOUND_ROWS in Ihrer Abfrage und dann Ausgabe a SELECT FOUND_ROWS();, um die Gesamtzahl zu erhalten.

Sie können versuchen, die Abfrage count (*) als Unterabfrage in Ihre Hauptabfrage zu injizieren, aber für mich ist das nur unnötige Komplikation Ihrer Abfrage.

Verwandte Themen