2015-07-21 29 views
0

我认为这是使用示例最好的问题。在MySQL中创建一个新列,该列是另一列的移位版本,其中有一个空行?

说,我原来的表被称为起源是

+-------+-------+------+ 
| list | type | date | 
+-------+-------+------+ 
| a1 | a  | 1 | 
| a2 | a  | 2 | 
| a3 | a  | 3 | 
| a4 | a  | 4 | 
| a5 | a  | 5 | 
| a6 | a  | 6 | 
| ... | ... | ... | 
| a(n-1)| a  | (n-1)| 
| an | a  | n | 
| b1 | b  | 1 | 
| b2 | b  | 2 | 
| b3 | b  | 3 | 
| b4 | b  | 4 | 
| b5 | b  | 5 | 
| b6 | b  | 6 | 
| ... | ... | ... | 
+-------+-------+------+ 

,我想增加一列名为list_shifted(list_s)其中

+-------+-------+-------+------+ 
|list_s | list | type | date | 
+-------+-------+-------+------+ 
| NULL | a1 | a  | 1 | 
| a1 | a2 | a  | 2 | 
| a2 | a3 | a  | 3 | 
| a3 | a4 | a  | 4 | 
| a4 | a5 | a  | 5 | 
| a5 | a6 | a  | 6 | 
| ... | ... | ... | ... | 
|a(n-2) | a(n-1)| a  | (n-1)| 
|a(n-1) | an | a  | n | 
| NULL | b1 | b  | 1 | 
| b1 | b2 | b  | 2 | 
| b2 | b3 | b  | 3 | 
| b3 | b4 | b  | 4 | 
| b4 | b5 | b  | 5 | 
| b5 | b6 | b  | 6 | 
| ... | ... | ... | ... | 
+-------+-------+-------+------+ 

有一个简单的方法来做到这一点

回答

0

它看起来像列listlist_s是依赖于其他两个。

我会质疑这些列的需求,您可以随时构建查询数据时所需的列。

对于list

SELECT CONCAT(type,date) list 
    FROM origin 

list_s

SELECT CASE 
     WHEN date - 1 > 0 THEN CONCAT(type,date - 1) 
     ELSE NULL 
     END CASE list_s 
    FROM origin 
0

这里是两个查询,可以解决你的问题。

第一个如果你的日期列在每一个下一行增加1(对于每一种类型)就像你在你发布的问题例子从1到5它总是1,2,3,4,5然后你可以简单地制作一个RIGHT JOIN这样的:

SELECT ts.list, tx.* 
FROM (SELECT `list`, type, `date` 
     FROM t1) AS ts 
RIGHT JOIN t1 AS tx 
ON ts.type = tx.type AND ts.date = (tx.date - 1); 

第二个是解决方案,如果日期是不是在正确的顺序(如果有的行被删除或像这样)和数字1到5没有必要具备所有的人都喜欢1,2,5 ...然后你可以使用临时变量(当然可以用在第一种情况下,但查询有点复杂)。

SELECT CASE WHEN type_s = type THEN list_s ELSE null END AS list_s, `list`, type, `date` 
FROM (SELECT @prev AS list_s, @prev := tx.list AS `list`, 
      @prevTyp AS type_s, @prevTyp := tx.type AS type, tx.date 
     FROM (SELECT @prev := null) AS i, (SELECT @prevTyp := null) AS y, t1 AS tx 
     ORDER BY tx.type, tx.date) AS myTable; 

这里是SQL Fiddle两个查询,看看它是如何工作的。

注意插入值时的一行被注释。我这样做,所以你可以看到第一个查询的'问题'在哪里! (如果您取消注释,它将按照您希望的结果工作)。

GL!

P.S.如果您有任何问题请填写下面的评论...

相关问题