查询列中的循环值

时间:2015-08-06 06:25:05

标签: mysql sql database

我需要进行一次查询,一次只将一列的值移动一行↑:

func setAlbumCover(){

   var AlbumImage = MPMediaItemArtwork()

    self.view.backgroundColor = UIColor(patternImage: UIImage(named: AlbumImage)!)

    if !UIAccessibilityIsReduceTransparencyEnabled() {
        self.view.backgroundColor = UIColor.clearColor()
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.ExtraLight)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.view.bounds
        self.view.addSubview(blurEffectView) //if you have more UIViews on screen, use insertSubview:belowSubview: to place it underneath the lowest view instead

        //add auto layout constraints so that the blur fills the screen upon rotating device
        blurEffectView.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.addConstraint(NSLayoutConstraint(item: blurEffectView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0))
        self.view.addConstraint(NSLayoutConstraint(item: blurEffectView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0))
        self.view.addConstraint(NSLayoutConstraint(item: blurEffectView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0))
        self.view.addConstraint(NSLayoutConstraint(item: blurEffectView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1, constant: 0))
    } else {
        self.view.backgroundColor = UIColor.whiteColor()
    }

}

因此,下次运行查询时,它应该看起来像这样

    +------------+----------------+
    | anotherCOL | values_to_loop |
    +------------+----------------+
    |          1 |              1 |
    |          2 |              2 |
    |          3 |              3 |
    |          4 |              4 |
    |          5 |              5 |
    |          6 |              6 |
    |          7 |              7 |
    |          8 |              8 |
    |          9 |              9 |
    |         10 |             10 |
    +------------+----------------+

我需要循环只有一个MYSQL COLUMN的值,就像每次运行查询时将值移动一个ROW UP↑。

注意:提供的表格只是说明性的,数据不同。

3 个答案:

答案 0 :(得分:1)

我创建了一个示例表,并添加了一个select来获取循环值,并更新以循环表中的值。另外,使用@start_value变量来知道可能是其他的“1”。试试这个:

CREATE TEMPORARY TABLE IF NOT EXISTS temp_table 
  (other_col INT, loop_col int);

INSERT INTO temp_table (other_col, loop_col) VALUES (1,1);
INSERT INTO temp_table (other_col, loop_col) VALUES (2,2);
INSERT INTO temp_table (other_col, loop_col) VALUES (3,3);
INSERT INTO temp_table (other_col, loop_col) VALUES (4,4);
INSERT INTO temp_table (other_col, loop_col) VALUES (5,5);


DECLARE start_value INT;
SELECT  start_value = MIN(loop_col) FROM temp_table;

SELECT  T1.other_col, ISNULL(T2.loop_col, start_value)
FROM    temp_table T1
        LEFT JOIN temp_table T2
            ON T1.loop_col = T2.loop_col - 1;


UPDATE T1 SET
    T1.loop_col = ISNULL(T2.loop_col, @start_value)
FROM    temp_table T1
        LEFT JOIN temp_table T2
            ON T1.loop_col = T2.loop_col - 1;

SELECT *
FROM    temp_table;

让我知道它是否适合你。

一步一步:

1 - 创建了一个值为1到5的temp_table

2 - 声明了一个start_value,它将保持你需要循环的列的最低值

3 - 从具有相同temp_table的temp_table自左连接中选择所有行。连接条件在loop_col - 1上,因此它可以向上移动行

4 - 相同的自我左连接,但这次也更新了值。

请注意,如果我得到一个空值,它应该是start_value,因为它不匹配

答案 1 :(得分:1)

以下是在单个UPDATE查询中执行此操作的方法:

UPDATE tbl a
INNER JOIN (
    SELECT values_to_loop
    FROM (SELECT * FROM tbl) c
    ORDER BY anotherCOL
    LIMIT 1
) b ON 1 = 1
SET a.values_to_loop = 
    IFNULL(
        (SELECT values_to_loop
         FROM (SELECT * FROM tbl) c
         WHERE c.anotherCOL > a.anotherCOL
         ORDER BY c.anotherCOL
         LIMIT 1),
        b.values_to_loop
    )

它的工作原理如下:

  1. 更新来自tbl
  2. 的所有记录
  3. 加入临时表以检索values_to_loop的最高值(将返回到底部的那个)
  4. 将values_to_loop的新值设置为下一行(c.anotherCOL > a.anotherCOL ... LIMIT 1
  5. 中的相应值

    注意:

    • 即使anotherCOL中存在空白(例如:1,2,3,6,9,15),这也有效。
    • 需要使用(SELECT * FROM tbl)而不是tbl,因为您不允许使用您在更新查询中更新的表格

    在anotherCOL

    中没有间隙时更快查询

    如果anotherCOL中的值没有间隙,您可以使用下面的查询,如果您在anotherCOL上有索引,该查询应该可以很快地运行:

    UPDATE tbl a
    LEFT JOIN tbl b on b.anotherCOL = a.anotherCOL + 1
    LEFT JOIN (
        SELECT values_to_loop
        FROM tbl
        WHERE anotherCOL = (select min(anotherCOL) from tbl)
    ) c ON 1 = 1
    SET a.values_to_loop = ifnull(
        b.values_to_loop,
        c.values_to_loop
    )
    

答案 2 :(得分:0)

也许这就是你的想法:

update T
set values_to_loop = mod(values_to_loop, 10) + 1

update T
set values_to_loop =
    coalesce(
        (
            select min(t2.values_to_loop) from T t2
            where t2.values_to_loop > T.values_to_loop
        ),
        (
            select min(values_to_loop) from T
        )
    )