MYSQLI - получение всех последних идентификаторов, когда я использую union all и group by - PullRequest
0 голосов
/ 24 сентября 2018

Как изменить следующий код, чтобы получить максимальный идентификатор всех наборов троек (nr1, n2, n3)?Каждый набор троек встречается несколько раз (несколько идентификаторов).Я хочу получить максимальный идентификатор каждой тройки.например:

id    Number1   Number2   Number3   Number4   Number5                                                                       
66       2         3         4         7         9
74       2         3         5         6         8                        
102      3         7         8         9        10
123      3         6         7         9        10
157      1         2         3         4         5   
188      1         2         3         5         7 

ответ (две первые строки (порядок по количеству)):

nr1   nr2   nr3   count   max_id                                            
 2     3     5      3       188
 3     7     9      3       123

Я пытался добавить идентификатор в select и, но получил неполные результаты.Пожалуйста, помогите.

select nr1,nr2,nr3, count(*)
from         (select Number1 as nr1, Number2 as nr2, Number3 as nr3 from tab
              union all
              select Number1 as nr1, Number2 as nr2, Number4 as nr3 from tab
              union all
              select Number1 as nr1, Number2 as nr2, Number5 as nr3 from tab
              union all
              select Number1 as nr1, Number3 as nr2, Number4 as nr3 from tab
              union all
              select Number1 as nr1, Number3 as nr2, Number5 as nr3 from tab
              union all
              select Number1 as nr1, Number4 as nr2, Number5 as nr3 from tab
              union all
              select Number2 as nr1, Number3 as nr2, Number4 as nr3 from tab
              union all
              select Number2 as nr1, Number3 as nr2, Number5 as nr3 from tab
              union all
              select Number2 as nr1, Number4 as nr2, Number5 as nr3 from tab
              union all
              select Number3 as nr1, Number4 as nr2, Number5 as nr3 from tab) g
group by nr1, nr2, nr3
ORDER BY count(*) DESC, nr1, nr2, nr3

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы должны исправить свою структуру данных.Было бы лучше иметь одну строку для каждого идентификатора и номера.

Это будет выглядеть сложно.Что необычно, я начну с представления (MySQL не поддерживает CTE):

create view better_data as
    select id, number1 as num, 1 as which from tab union all
    select id, number2 as num, 2 as which from tab union all
    select id, number3 as num, 3 as which from tab union all
    select id, number4 as num, 4 as which from tab union all
    select id, number5 as num, 5 as which from tab;

Затем вы можете сгенерировать все тройки, используя:

select distinct bd1.num, bd2.num, bd3.num
from better_data bd1 cross join
     better_data bd2 cross join
     better_data bd3
where bd1.num < bd2.num and bd2.num < bd3.num;

Теперь вы можетепосчитайте их с агрегацией:

select triples.num1, triples.num2, triples.num3, count(*) as cnt
from (select distinct bd1.num as num1, bd2.num as num2, bd3.num as num3
      from better_data bd1 cross join
           better_data bd2 cross join
           better_data bd3
      where bd1.num < bd2.num and bd2.num < bd3.num
     ) triples left join
     t
     on triples.num1 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5) and
        triples.num2 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5) and
        triples.num3 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5)
group by triples.num1, triples.num2, triples.num3
order by count(*) desc;
0 голосов
/ 24 сентября 2018

последний в порядке DESC является первым в ASC, поэтому вы можете использовать предел 1 для ASC

    select nr1,nr2,nr3, count(*)
    from         (select Number1 as nr1, Number2 as nr2, Number3 as nr3 from table
                  union all
                  select Number1 as nr1, Number2 as nr2, Number4 as nr3 from table
                  union all
                  select Number1 as nr1, Number2 as nr2, Number5 as nr3 from table
                  union all
                  select Number1 as nr1, Number3 as nr2, Number4 as nr3 from table
                  union all
                  select Number1 as nr1, Number3 as nr2, Number5 as nr3 from table
                  union all
                  select Number1 as nr1, Number4 as nr2, Number5 as nr3 from table
                  union all
                  select Number2 as nr1, Number3 as nr2, Number4 as nr3 from table
                  union all
                  select Number2 as nr1, Number3 as nr2, Number5 as nr3 from table
                  union all
                  select Number2 as nr1, Number4 as nr2, Number5 as nr3 from table
                  union all
                  select Number3 as nr1, Number4 as nr2, Number5 as nr3 from table) g
    group by nr1, nr2, nr3
    ORDER BY count(*) ASC, nr1, nr2, nr3
    LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...