2016-07-20 5 views
2

以下のクエリを使用して、指定した半径内のプロパティを検索して結果を返します。MySQL - HAVINGが指定されたときにCOUNT()を使用して合計結果を返す

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 

しかし、私は今、ページ分割を追加したいので、 "LIMIT 0、10"が何らかの形でクエリを返します。たとえば、結果が100件ありますが、最初の10件に限定している場合は、合計を100として返します。

選択後に「COUNT(*)AS total」を追加しようとしましたが、返される。

この方法でクエリの合計を返す方法を教えてください。

+0

SQL_CALC_FOUND_ROWS以降、SELECT FOUND_ROWS()の後。 – splash58

+0

SQL_CALC_FOUND_ROWSは明らかに最大10倍遅いです:http://stackoverflow.com/questions/186588/which-is-fastest-select-sql-calc-found-rows-from-table-or-select-count – Reado

+0

総計、行数または総プロパティ数? – Avishake

答えて

2

私はそれはそれを達成するためにサブクエリが必要になると思う:

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

あなたは、COUNT(*)またはスプラッシュが示されているように制限することなく、別のクエリを使用する必要があなたのクエリでSQL_CALC_FOUND_ROWSを使用し、問題のいずれか総数はSELECT FOUND_ROWS();です。

メインクエリでサブクエリとしてカウント(*)クエリを挿入できますが、それはクエリの不要な複雑さだけです。

関連する問題