MySQL - проблема с таблицами ссылок (выбор уникальных строк) - PullRequest
0 голосов
/ 15 апреля 2019

Я пытался разобраться, но не получилось. У меня ниже снимок моей проблемы, и она была сокращена. То, что я хочу, это следующее:

action_id   event_id    link    text    duration
339054      10221877    317547  text1   30
339057      10221877    317548  text2   45
339061      10221877    317549  text3   30
339065      10221877    317551  text4   40
339074      10221877    317550  text5   60
339075      10221877    317552  text6   80

Это возможно даже с двумя столами? если нет, что может быть полезным?

CREATE TABLE time1
(

prim int (5),
booking int (5) PRIMARY KEY,
duration int (5));

insert into time1 values 
( 10221877, 296480,30),
( 10221877, 296484,45),
( 10221877, 296487,30),
( 10221877, 296492,40),
( 10221877, 296494,60),
( 10221877, 296510,80),
( 10221877, 296511,11);


CREATE TABLE action1
(

action_id int (5) PRIMARY KEY,
event_id int (5),
link int (5),
text_text VARCHAR(255)

);

insert into action1 values 
(339054,10221877,317547,"text1"),
(339057,10221877,317548,"text2"),
(339061,10221877,317549,"text3"),
(339065,10221877,317551,"text4"),
(339074,10221877,317550,"text5"),
(339075,10221877,317552,"text6");

Ответы [ 4 ]

2 голосов
/ 23 апреля 2019

Как я вижу, вы хотите присоединить первую строку таблицы action1 к первой строке таблицы time1, вторую строку таблицы action1 ко второй строке time1 и так далее.Таким образом, вы можете использовать переменные для вычисления порядкового номера строк и объединения таблиц по нему.Например:

SELECT a.action_id, a.event_id, a.link, a.text_text, t.duration
FROM (SELECT action_id,
             event_id,
             link,
             text_text,
             IF(@event_id = event_id, @rownumber := @rownumber + 1, @rownumber := 0) as rownumber,
             @event_id := event_id
      FROM action1,
           (SELECT @event_id := 0, @rownumber := 0) AS rn) as a
         LEFT JOIN
     (SELECT duration,
             prim,
             IF(@prim = prim, @rownumber := @rownumber + 1, @rownumber := 0) as rownumber,
             @prim := prim
      FROM time1,
           (SELECT @prim := 0, @rownumber := 0) AS rn) as t ON a.event_id = t.prim AND a.rownumber = t.rownumber

Результат:

--------------------------------------------------------
| action_id | event_id | link   | text_text | duration |
--------------------------------------------------------
|    339054 | 10221877 | 317547 | text1     |       30 |
|    339057 | 10221877 | 317548 | text2     |       45 |
|    339061 | 10221877 | 317549 | text3     |       30 |
|    339065 | 10221877 | 317551 | text4     |       40 |
|    339074 | 10221877 | 317550 | text5     |       60 |
|    339075 | 10221877 | 317552 | text6     |       80 |
--------------------------------------------------------

DEMO in DBFiddle

1 голос
/ 23 апреля 2019

То, что вы хотите, выглядит как JOIN, посмотрите на этот ответ прямо здесь , так как в нем много информации о соединениях, и я постараюсь выполнить следующий запрос

SELECT * FROM `time1` INNER JOIN `action1` ON `time1`.`prim` = `action1`.`event_id`

если я правильно понял введенные вами данные.

0 голосов
/ 23 апреля 2019

Я получил это, чтобы работать с использованием оконных функций на MySQL 8.0:

SELECT a.action_id, a.event_id, a.link, a.text_text, t.duration
FROM (SELECT *, ROW_NUMBER() OVER () AS rownum FROM time1 ORDER BY booking) AS t
JOIN (SELECT *, ROW_NUMBER() OVER () AS rownum FROM action1 ORDER BY action_id) AS a
  USING (rownum)

Выход:

+-----------+----------+--------+-----------+----------+
| action_id | event_id | link   | text_text | duration |
+-----------+----------+--------+-----------+----------+
|    339054 | 10221877 | 317547 | text1     |       30 |
|    339057 | 10221877 | 317548 | text2     |       45 |
|    339061 | 10221877 | 317549 | text3     |       30 |
|    339065 | 10221877 | 317551 | text4     |       40 |
|    339074 | 10221877 | 317550 | text5     |       60 |
|    339075 | 10221877 | 317552 | text6     |       80 |
+-----------+----------+--------+-----------+----------+

Я должен прокомментировать, что нетипично объединять строки на основе их номера. Не должно быть никакого неявного порядка в строках, и вы должны объединять их только по значению, а не по положению строки.

В вашем примере число booking, кажется, увеличивается, но я не знаю, является ли это надежным предположением в ваших данных или совпадением в вашем примере. И я не знаю, правильно ли я делаю предположение, что вы хотите, чтобы строки соединялись по позиции. Это соответствует вашему примеру, но опять же это может быть просто совпадением.

Я также не могу сказать из вашего примера, как вы хотите выполнить объединение, когда существует более одного event_id значения. Вы хотите, чтобы нумерация строк начиналась заново или просто соответствовала строке за строкой, row_number()? Что если в двух таблицах в event_id имеется разное количество строк? Вам нужно использовать LEFT OUTER JOIN? Или FULL OUTER JOIN?

0 голосов
/ 23 апреля 2019

Вы можете попробовать что-то вроде ниже с windows functions, чтобы получить результат. Здесь я объединяю 2 таблицы и присваиваю row_number() для каждой строки, а затем присваиваю номер группы, используя DENSE_RANK(), а затем получаю результаты, сопоставляя rownumber и groupnumber. Надеюсь, это поможет.

select action_id,event_id,link,text_text,duration from (
    select action1.*,duration,(row_number() over (partition by action1.action_id)) as rowno,
           (dense_rank() over (order by action1.action_id)) as groupno  from action1
    join time1 
    on action1.event_id = time1.prim
) as mytable
where mytable.rowno = mytable.groupno

Вы можете проверить результаты здесь: ДЕМО ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...