0

私は3つのテーブルを持っています

tblMarkers tblReviews tblImages

tblMarkers からすべてのレコードと、各マーカーのすべてのレビューと画像の数を返したいと考えています。さらに複雑にするために、既知のポイントの半径内にあるすべてのマーカーを返す必要があります。

したがって、期待される結果は

MarkerID-MarkerName-ReviewCount-ImageCount

1223-SomeName-0-1

これは私がこれまでに持っていたもので、これはレビューの数を返しますが、画像の数を追加するための正しい SQL を取得できません

SELECT
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`, 
(3959 * acos( cos( radians('45.1') ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians('6') ) + sin( radians('45.1') ) * sin( radians( Latitude ) ) ) )  
AS distance,
Count(`tblReviews`.`marker_id`) As reviewCount
FROM
`tblMarkers`
LEFT JOIN `tblReviews` ON `tblMarkers`.`ID` = `tblReviews`.`marker_id`
GROUP BY
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`
HAVING
`distance` < '50'
ORDER BY
distance;

Images テーブルの構造は次のとおりです。

ID [primaryKey] (same as tblMarkers.ID)
file
title

すべての画像の数を追加するにはどうすればよいですか?

4

2 に答える 2

1

これを試して:

SELECT M.ID
    , M.Type
    , M.Name
    , M.Latitude
    , M.Longitude
    , (3959 * acos(cos(radians('45.1')) * cos(radians(M.Latitude )) * cos(radians(M.Longitude) - radians('6')) + sin(radians('45.1')) * sin(radians(M.Latitude ))))  AS distance
    , IFNULL(COUNT(DISTINCT R.review_id) , 0) AS ReviewCount
    , IFNULL(COUNT(DISTINCT I.ID), 0) AS ImageCount
    FROM tblMarkers AS M
    LEFT JOIN tblReviews AS R ON R.marker_id = M.ID
    LEFT JOIN tblImages AS I ON I.marker_id = M.ID
    GROUP BY M.ID, M.Type, M.Name, M.Latitude, M.Longitude
    HAVING distance < 50
    ORDER BY distance

私はあなたがすでに知っているに違いないLEFT JOIN。そのため、すべての個別のレビュー IDCOUNT(DISTINCT R.review_id))を数えていました (一意であることを確認してください)。特定のマーカーレコードに対応するレビューと画像レコードがない場合、以前は を表示していました。review_idIFNULL(XXX , 0)0

ALIASESを使用して、クエリをすっきりと整理しました。遠慮なく尋ねてください。

于 2013-06-13T11:33:28.987 に答える
0

画像テーブルの IF ID フィールドがマーカー テーブル ID フィールドの参照である場合、クエリは次のようになります。

SELECT
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`, 
(3959 * acos( cos( radians('45.1') ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians('6') ) + sin( radians('45.1') ) * sin( radians( Latitude ) ) ) )  
AS distance,
Count(`tblReviews`.`marker_id`) As reviewCount,
Count(`tblImage`.`ID`) As imageCount,
FROM
`tblMarkers`
LEFT JOIN `tblReviews` ON `tblMarkers`.`ID` = `tblReviews`.`marker_id`
LEFT JOIN `tblImage` ON `tblMarkers`.`ID` = `tblImages`.`ID`
GROUP BY
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`
HAVING
`distance` < '50'
ORDER BY
distance;
于 2013-06-13T10:58:48.887 に答える