Как получить лучшие n решений по группам / категориям после объединения в MySQL? [Дубликат]

Существует несколько уровней отладки, которые вам могут понадобиться, но самый простой - добавить переменную среды ANSIBLE_STRATEGY=debug, которая позволит отладчику при первой ошибке.

0
задан Bill Karwin 25 March 2019 в 13:36
поделиться

3 ответа

Я понимаю, что ваш вопрос заключается в том, что вы хотите получить порядок рейтинговых данных с подробностями города:

    select b.city,b.country,a.region,a.rating from
  (SELECT max(c.id) as city_id,
       c.region,
       max(n.rating) as rating from cities c
  JOIN nightlife n
ON n.cityID = c.id
WHERE c.popular = true
group by c.region
ORDER BY n.rating
DESC) a inner join cities b on a.city_id=b.id;
0
ответ дан Devratna 25 March 2019 в 13:36
поделиться
SELECT n.id
     , n.city
     , n.country
     , n.region
     , n.popular
     , n.rating
  FROM 
     ( SELECT a.*
            , CASE WHEN @prev = region THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev:=region prev 
         FROM
            ( SELECT c.*
                   , n.rating
                FROM cities c 
                JOIN nightlife n 
                  ON n.cityid = c.id 
               ORDER 
                  BY region
                   , rating DESC
            ) a
         JOIN ( SELECT @prev:=null,@i:=0) vars
      ) n
  WHERE n.i <= 2;

  +------+-----------+---------+--------+---------+--------+
  | id   | city      | country | region | popular | rating |
  +------+-----------+---------+--------+---------+--------+
  |   23 | shanghai  | spain   | asia   |       1 |    9.5 |
  |   54 | tokyo     | japan   | asia   |       1 |    9.3 |
  |    1 | barcelona | spain   | europe |       1 |     10 |
  |    5 | paris     | france  | europe |       1 |      9 |
  +------+-----------+---------+--------+---------+--------+
0
ответ дан Strawberry 25 March 2019 в 13:36
поделиться

Вы можете попытаться использовать оператор UNION, чтобы получить ПЕРВЫЙ и ВТОРОЙ лучшие города в регионе. Чтобы получить второе по величине значение, я использую этот SO ответ

SELECT  C.region, C.city, C.id, MAX(N.rating) as rating
FROM   cities C
INNER JOIN nightlife N
ON         C.ID = N.cityID 
GROUP BY C.region
UNION 
SELECT  C.region, C.city, C.id, MAX(N.rating) as rating
FROM   cities C
INNER JOIN nightlife N
ON         C.ID = N.cityID 
WHERE N.rating < (SELECT MAX(rating) 
                  FROM   nightlife 
                  INNER JOIN cities 
                  ON cities.ID = nightlife.cityID 
                  WHERE region = c.region)
GROUP BY C.region
ORDER BY region,rating desc,city

Это рабочее решение Fiddle

0
ответ дан kiks73 25 March 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: