1

各場所で最高の評価と製品を取得するにはどうすればよいですか? これは、SQL ステートメントの詳細です。誰でもエラーがどこにあるかを見つけるのを手伝ってもらえますか? 必要な値が取得されません。

*Mysqlデータベースを使用

これは私のSQL文です:

SELECT r.rating,
       r.product,
       l.places,
       l.address,
       l.telephone,
       l.lng,
       l.lat
FROM   locations AS l
       LEFT JOIN ratings AS r
         ON l.places = r.places
ORDER  BY r.rating DESC 
4

3 に答える 3

2

使用しているデータベースサーバーについて言及していないため、以下のクエリは、以下を含むほぼすべてのRDBMSで機能します。MySQL

SELECT  r.rating, 
        r.product, 
        l.places, 
        l.address, 
        l.telephone, 
        l.lng, 
        l.lat 
FROM    locations AS l 
        INNER JOIN ratings AS r 
            ON l.places = r.places 
        (
            SELECT  a.places, b.product, MAX(b.rating) max_rating
            FROM    locations a
                    INNER JOIN ratings b
                        ON a.places = b.places 
            GROUP   BY a.places, b.product
        ) c ON l.places = c.places AND
                r.product = c.product AND
                r.rating = c.max_Rating
ORDER   BY r.rating desc

または、RDBMSがウィンドウ関数をサポートしている場合、

SELECT  rating, product,  places, 
        address,  telephone,  lng,  lat
FROM
    (
        SELECT  r.rating, r.product,  l.places, 
                l.address,  l.telephone,  l.lng,  l.lat 
                ROW_NUMBER() OVER (PARTITION BY r.product,  l.places
                                    ORDER BY r.rating DESC) rn
        FROM    locations AS l 
                INNER JOIN ratings AS r 
                    ON l.places = r.places 
    )   x
WHERE   x.rn = 1    
ORDER   BY rating desc

于 2013-01-22T12:37:52.147 に答える
1

新しいバージョンの sql-server を想定しています。これはテストされていません-正しいパーティションについて少し確信が持てません...どちらかl.placesまたはr.product. これを試して...

;WITH cte
    as
    (
    SELECT     
               r.rating,
           r.product,
           l.places,
           l.address,
           l.telephone,
           l.lng,
           l.lat,
           [rnk] = RANK OVER(PARTITION BY l.places ORDER BY r.rating DESC)
    FROM   locations AS l
           LEFT JOIN ratings AS r
             ON l.places = r.places
    )
SELECT
        rating,
        product,
        places,
        address,
        telephone,
        lng,
        lat
FROM cte
WHERE [rnk] = 1
ORDER  BY rating DESC 
于 2013-01-22T12:41:13.270 に答える
1

SQL サーバーのバージョン (2005 以降):

WITH x 
     AS (SELECT r.rating, 
                r.product, 
                l.places, 
                l.address, 
                l.telephone, 
                l.lng, 
                l.lat, 
                RN = Rank() 
                       OVER( 
                         partition BY l.places 
                         ORDER BY rating DESC) 
         FROM   locations AS l 
                INNER JOIN ratings AS r 
                        ON l.places = r.places 
SELECT *  FROM   x  WHERE  rn = 1 
于 2013-01-22T12:45:42.753 に答える