заполнить значения с помощью выбора - PullRequest
0 голосов
/ 08 октября 2018

Обновление: Вот демонстрация проблемы: http://www.sqlfiddle.com/#!9/15ff5e/1

Я пытаюсь выполнить левое соединение для следующих 2 таблиц:

post_metrics

| post_id | likes |
|---------|-------|
| 'aaa'   |     3 |
| 'aaa'   |     7 |
| 'aaa'   |     8 |
| 'bbb'   |     2 |
| 'bbb'   |     4 |

post_history

| post_id | post_text |
|---------|-----------|
| 'aaa'   | 'doug'    |
| 'bbb'   | 'steve'   |

Результаты аналогичны следующим:

| post_id | likes | post_text |
|---------|-------|-----------|
| 'aaa'   |     3 | 'doug'    |
| 'aaa'   |     7 | NULL      |
| 'aaa'   |     8 | NULL      |
| 'bbb'   |     2 | 'steve'   |
| 'bbb'   |     4 | NULL      |

Я хотел бы заполнить эти значения NULL данными из предыдущих строк, чтобы результат был таким:

| post_id | likes | post_text |
|---------|-------|-----------|
| 'aaa'   |     3 | 'doug'    |
| 'aaa'   |     7 | 'doug'    |
| 'aaa'   |     8 | 'doug'    |
| 'bbb'   |     2 | 'steve'   |
| 'bbb'   |     4 | 'steve'   |

Однакозапрос, который я использую ...

SELECT m.id,
       m.likes,
       @username := ifnull(p.username, @username) as username
FROM (select * from `post_metrics` WHERE post_id = @post_id) AS m
LEFT JOIN `post_history` AS p ON (m.post_id = p.post_id)

... дает мне следующие результаты:

| post_id | likes | post_text |
|---------|-------|-----------|
| 'aaa'   |     3 | 'doug'    |
| 'aaa'   |     7 | 'steve'   |
| 'aaa'   |     8 | 'steve'   |
| 'bbb'   |     2 | 'steve'   |
| 'bbb'   |     4 | 'steve'   |

Как правильно заполнить нулевые значения из предыдущих строк?

Это таблицы с миллионами строк и около 6 столбцов разреженных нулевых значений для заполнения.Поле 'post_text' не всегда одинаково для каждого post_id (иногда меняется), поэтому мне нужно распространить эти изменения на следующие строки, имеющие NULL.

Ответы [ 2 ]

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

Проблема с вашим существующим запросом состоит в том, что @username вычисляется на основе неупорядоченной строки, выведенной из вашего запроса.Поэтому вам нужно сначала упорядочить данные, а затем выполнить подстановку username (или, в зависимости от вашего SQLFiddle, post_text).Поэтому я думаю, что этот запрос должен делать то, что вы хотите:

SELECT post_id, 
       date, 
       likes,
       @post_text := COALESCE(post_text, @post_text) AS post_text
FROM (SELECT 
       m.post_id,
       m.date,
       m.likes,
       p.post_text 
      FROM `post_metrics` m
      LEFT JOIN `post_history` AS p ON m.post_id = p.post_id and m.date = p.date
      ORDER BY m.post_id, m.date) o
JOIN (SELECT @post_text := '') t

Вывод:

post_id     date        likes   post_text
aaa         2018-09-01  3       ccccc
aaa         2018-09-02  7       ccccc
aaa         2018-09-03  8       ccccd
bbb         2018-09-01  2       eeeee
bbb         2018-09-02  4       eeeee

SQLFiddle Demo

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

Попробуйте ниже, используя внутреннее соединение

SELECT m.id,
       m.likes,
       m.username 
       from `post_metrics`  m
inner JOIN `post_history` AS p ON m.post_id = p.post_id
...