Упорядочить по и ограничить в объединении нескольких таблиц, используя Group By, чтобы сделать ограничение по и Макс. - PullRequest
0 голосов
/ 20 октября 2018
Select group_concat(ID SEPARATOR '|') 
  from TableJ J
  Left Join TableL L on L.J_ID=J.ID
  Left Join TableB B on B.LJ_ID=L.F_ID
  Left Join TableLJ LJ on LJ.ID=L.F_ID
Group 
    by J.ID

Выходные данные возвращают записи типа

  • 103237 | 43775 | 84462 | 19153 | 54618 | 108646 | 50142 | 96946 | 37251 | 75984 | 54524
  • 29728 | 46758| 65987 | 20772 | 34513 | 61323 | 2778 | 32630 | 53616 | 103450 | 27152 | 37278 | 65950 | 13837 | 33500 | 59490

и т. Д.

Вопрос в том, что мне нужноограничьте количество записей / каналов в результатах до 5 записей.

В TableLJ есть поле Population, которое я могу использовать для сортировки и ограничения, но никакие изменения не позволяют мне указать, что я хочу выбрать.верхние 5 из этой таблицы в группе PER.

Обновление: я могу сделать следующее, чтобы ограничить group_concat (по-прежнему не решается сначала отсортировать их по LJ.Population)

substring_index(group_concat(ID SEPARATOR '|'),'|',5)

1 Ответ

0 голосов
/ 20 октября 2018
  • Group_Concat() функция имеет необязательное предложение Order By, с помощью которого мы можем отсортировать значения столбцов в concat, основываясь на другом / том же столбце (столбцах).
  • Вы можете использовать функцию Substring_Index(), чтобы ограничить объединенную строку до 5 для группы.

Попробуйте:

SELECT Substring_Index(Group_concat(ID 
                                    ORDER BY LJ.Population ASC 
                                    SEPARATOR '|'), 
                       '|', 
                       5) 
FROM   TableJ AS J
       LEFT JOIN TableL AS L
              ON L.J_ID = J.ID
       LEFT JOIN TableB AS B
              ON B.LJ_ID = L.F_ID
       LEFT JOIN TableLJ AS LJ
              ON LJ.ID = L.F_ID
GROUP  BY J.ID 

В MySQL 8.0.2 и далее мы можем использовать Функции окна , чтобы определить Row_Number() в пределах раздела для J.ID.Мы можем отсортировать по LJ.Population, чтобы получить соответствующий номер строки.

Теперь используйте этот набор результатов как Производная таблица и рассмотрите только строки до номера строки 5. Затем вы можетесделайте Group By и Group_Concat() соответственно.

SELECT   Group_Concat(dt.ID ORDER BY dt.rownumber ASC SEPARATOR '|')
FROM     (
          SELECT    J.ID,
                    ROW_NUMBER() OVER (PARTITION BY J.ID
                                       ORDER BY LJ.Population ASC) AS rownumber
          FROM      TableJ   AS J
          LEFT JOIN TableL   AS L
            ON  L.J_ID = J.ID
          LEFT JOIN TableB   AS B
            ON  B.LJ_ID = L.F_ID
          LEFT JOIN TableLJ  AS LJ
            ON  LJ.ID = L.F_ID ) AS dt
WHERE    dt.rownumber <= 5
GROUP BY dt.ID 
...