Порядок таблиц MySQL по значениям из таблицы отношений по самой новой дате - PullRequest
0 голосов
/ 10 октября 2018

Можно ли выбрать из строк таблицы MySQL, упорядоченных по значениям объединенной таблицы, на текущую дату?Может быть, я покажу это.У меня есть две таблицы: enter image description here

В одной стране много баллов, Сгруппированных по дате.Можно ли отсортировать страны по текущей дате?У меня есть страны с оценками из таблицы в массивах PHP:

    $countries = array(
    'England' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-07', 'score' => 100),
                1 => array('date' => '2018-08', 'score' => 50)
            )),
    'USA' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-08', 'score' => 50),
                1 => array('date' => '2018-09', 'score' => 20)
            )
        ),
    'France' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-08', 'score' => 30),
                1 => array('date' => '2018-09', 'score' => 100)
            )
        )
);

Мне нужно выбрать страны, упорядоченные по оценкам на текущую дату.Допустим, текущая дата 2018-09.Мне нужно искать страны и сортировать их следующим образом:

$countries = array(
    'France' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-08', 'score' => 30),
                1 => array('date' => '2018-09', 'score' => 100)
            )
        ),
    'USA' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-08', 'score' => 50),
                1 => array('date' => '2018-09', 'score' => 20)
            )
        ),
    'England' =>
        array('name', 'tag',
            'scores' => array(
                0 => array('date' => '2018-07', 'score' => 100),
                1 => array('date' => '2018-08', 'score' => 50)
            )),
);
  1. В Англии последний раз нет баллов за дату '2018-09'
  2. Второй - Франция, потому что на дату '2018-09 'имеют 100 баллов
  3. США последний раз для даты' 2018-09 'имеют 20 баллов

ВЫБРАТЬ c.name, s.date, s.scoreИЗ страны c СЛЕДУЮЩИЙ РЕЙТИНГ s s scountry_id = c.id ГРУППА ПО ДАТЕ ЗАКАЗАТЬ ПО (??)

1 Ответ

0 голосов
/ 10 октября 2018

Мы могли бы сделать что-то вроде этого, чтобы получить последний результат date для каждого country_id вместе с score для этого последнего date, а затем упорядочить по этим значениям:

  SELECT c.name
       , s.date
       , s.score
    FROM country c
    LEFT
    JOIN score s
      ON s.country_id = c.id

    LEFT
    JOIN ( SELECT m.country_id
                , MAX(m.date) AS max_date
             FROM score m
            GROUP
               BY m.country_id
         ) n
      ON n.country_id = c.id
    LEFT
    JOIN score o
      ON o.country_id = n.country_id
     AND o.date       = n.max_date

   ORDER
      BY o.date        DESC
       , o.score       DESC
       , c.name        ASC
       , s.date        ASC

Обратите внимание, что это предполагает, что кортеж (country_id,date) является уникальным в таблице score.Если у нас нет такой гарантии, мы можем изменить запрос, чтобы учесть это.Примерно так:

    SELECT c.name
         , s.date
         , s.score
      FROM country c
      LEFT
      JOIN score s
        ON s.country_id = c.id

      LEFT
      JOIN ( SELECT o.country_id 
                  , o.date
                  , MAX(o.score) AS max_date_score
               FROM ( SELECT m.country_id
                           , MAX(m.date) AS max_date
                        FROM score m
                       GROUP
                          BY m.country_id
                    ) n
               JOIN score o
                 ON o.country_id = n.country_id
                AND o.date       = n.max_date
              GROUP
                 BY o.country_id
                  , o.date
           ) p
        ON p.country_id = c.id

     ORDER
        BY p.date           DESC
         , p.max_date_score DESC
         , c.name           ASC
         , s.date           ASC
         , s.score          DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...