用select填充值

qybjjes1  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(322)

更新:下面是问题的演示:http://www.sqlfiddle.com/#!9/15ff5e/1号
我正在尝试对以下两个表执行左联接:

  1. post_metrics
  2. | post_id | likes |
  3. |---------|-------|
  4. | 'aaa' | 3 |
  5. | 'aaa' | 7 |
  6. | 'aaa' | 8 |
  7. | 'bbb' | 2 |
  8. | 'bbb' | 4 |
  9. post_history
  10. | post_id | post_text |
  11. |---------|-----------|
  12. | 'aaa' | 'doug' |
  13. | 'bbb' | 'steve' |

结果如下:

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

我想用前几行的数据填充这些空值,结果如下:

  1. | post_id | likes | post_text |
  2. |---------|-------|-----------|
  3. | 'aaa' | 3 | 'doug' |
  4. | 'aaa' | 7 | 'doug' |
  5. | 'aaa' | 8 | 'doug' |
  6. | 'bbb' | 2 | 'steve' |
  7. | 'bbb' | 4 | 'steve' |

但是,我使用的查询。。。

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

…给了我以下结果:

  1. | post_id | likes | post_text |
  2. |---------|-------|-----------|
  3. | 'aaa' | 3 | 'doug' |
  4. | 'aaa' | 7 | 'steve' |
  5. | 'aaa' | 8 | 'steve' |
  6. | 'bbb' | 2 | 'steve' |
  7. | 'bbb' | 4 | 'steve' |

如何正确填充前几行的空值?
这些表有数百万行和大约6列稀疏的空值要填充。对于每个post\u id,'post\u text'字段并不总是相同的(偶尔会有变化),因此我需要将这些更改传播到以下具有null的行。

rjee0c15

rjee0c151#

现有查询的问题是 @username 基于查询的无序行输出计算。所以你需要先对数据进行排序,然后再进行 username 替换(或者,根据你的sqlfiddle, post_text ). 所以我认为这个查询应该满足您的要求:

  1. SELECT post_id,
  2. date,
  3. likes,
  4. @post_text := COALESCE(post_text, @post_text) AS post_text
  5. FROM (SELECT
  6. m.post_id,
  7. m.date,
  8. m.likes,
  9. p.post_text
  10. FROM `post_metrics` m
  11. LEFT JOIN `post_history` AS p ON m.post_id = p.post_id and m.date = p.date
  12. ORDER BY m.post_id, m.date) o
  13. JOIN (SELECT @post_text := '') t

输出:

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

sqlfiddle演示

展开查看全部
ukqbszuj

ukqbszuj2#

尝试下面使用内部连接

  1. SELECT m.id,
  2. m.likes,
  3. m.username
  4. from `post_metrics` m
  5. inner JOIN `post_history` AS p ON m.post_id = p.post_id

相关问题