1

MySQL では、場所ごとに最高点のアーティストを取得する必要があります。助けてください。

user_location_tbl (ユーザー ロケーション テーブル)

|--------------------------------------|
| countryLat | countryLong  |  userid  |
|--------------------------------------|
| 31.695766  | 54.624023    |  1       |
| 20.593684  | 78.96288     |  2       |
| 20.593684  | 78.96288     |  3       |
| 20.593684  | 78.96288     |  4       |
| 31.695766  | 54.624023    |  5       |
|--------------------------------------|

fans_table (どのアーティストがどのユーザーをファンとして持っているかを表示するため)

|----------------------|----------
| artist_id  | user_id |  Points |   
|----------------------|----------
| 1          | 1       |    20    |
| 1          | 2       |    30    |
| 2          | 1       |    40    |
| 2          | 3       |    40    |   
| 3          | 1       |    60    |
|----------------------|----------

artist_table (アーティストのリスト)

|-------------------|
| artistid | name   |
|-------------------|
| 1        | raja   | 
| 2        | sekar  |
| 3        | thomas |
|-------------------|

どのアーティストが最高点を獲得しているかを場所ごとに取得する必要がありますが、1 回のクエリでそれを行うことはできません。sum(points) を入れて、countryLat、countryLong、artistid でグループ化すると、次の結果が得られます...

|---------------------------------|
| 100 | 20.593684 | 78.96288  | 1 |
| 50  | 20.593684 | 78.96288  | 2 |
| 100 | 31.695766 | 54.624023 | 3 |
| 90  | 31.695766 | 54.624023 | 1 |
|---------------------------------|

...しかし、以下の例のように、その場所で最高点を持つアーティストだけが必要です...

|---------------------------------|
| 100 | 20.593684 | 78.96288  | 1 |
| 100 | 31.695766 | 54.624023 | 3 |
|---------------------------------|

SQL

SELECT Sum(c.tot_points), 
       a.artist_id 
FROM   `fans_table` AS a 
       INNER JOIN `user_location_tbl` AS b 
               ON a.user_id = b.user_id 
       INNER JOIN artist_table AS c 
               ON a.artist_id = c.id 
GROUP  BY b.countrylat, 
          b.countrylong, 
          a.artist_id 

上記は私のクエリです

4

2 に答える 2

1

エリア内のポイントが一意であると仮定すると (つまり、エリア内に同じように人気のあるアーティストが 2 人いないか、両方が必要な場合)、次のようになります。

SELECT Sub3.artist_id, Sub3.countryLat, Sub3.countryLong, Sub2.MaxArtistLocalPoints
FROM
(
    SELECT a.artist_id, countryLat, countryLong, SUM(a.Points) AS ArtistLocalPoints
    FROM `fans_table` AS a 
    INNER JOIN  `user_location_tbl` AS b ON a.user_id=b.user_id 
    INNER JOIN artist_table AS c ON a.artist_id=c.id 
    GROUP BY a.artist_id, countryLat, countryLong
) Sub3
INNER JOIN
(
    SELECT countryLat, countryLong, MAX(ArtistLocalPoints) AS MaxArtistLocalPoints
    FROM
    (
        SELECT a.artist_id, countryLat, countryLong, SUM(a.Points) AS ArtistLocalPoints
        FROM `fans_table` AS a 
        INNER JOIN  `user_location_tbl` AS b ON a.user_id=b.user_id 
        INNER JOIN artist_table AS c ON a.artist_id=c.id 
        GROUP BY a.artist_id, countryLat, countryLong
    ) Sub1
) Sub2
ON Sub3.countryLat = Sub2.countryLat
AND Sub3.countryLong = Sub2.countryLong
AND Sub3.ArtistLocalPoints = Sub2.MaxArtistLocalPoints
于 2013-06-28T13:12:28.717 に答える