有没有什么方法可以删除重复的SELECT语句?

时间:2014-01-10 05:40:25

标签: mysql sql select insert select-insert

为了简洁起见,我们假设我们有一个numbers表,其中有两列:id& number

CREATE TABLE numbers(
   id INT NOT NULL AUTO_INCREMENT,
   NUMBER INT NOT NULL,
   PRIMARY KEY ( id )
);

我希望number列自动增加,但在达到100之后从1重新启动,满足以下要求:

  1. 如果还没有记录,请将number设置为1。
  2. 如果表中已有记录:
    1. 如果最后一条记录number小于100,请将number设为+ 1。
    2. 如果最后一条记录number为100或更高,请将number设为1。
  3. 这是我到目前为止所拥有的:

    INSERT INTO `numbers` (`number`)
    VALUES (
        IF(
            IFNULL(
                (SELECT `number`
                FROM `numbers` as n
                ORDER BY `id` DESC
                LIMIT 1),
                0
            ) > 99,
            1,
            IFNULL(
                (SELECT `number`
                FROM `numbers` as n
                ORDER BY `id` DESC
                LIMIT 1),
                0
            ) + 1
        )
    )
    

    这可行,但使用两个相同的SELECT个查询。

    有没有办法删除重复的SELECT


    P.S。我想在查询中完成所有这些操作。没有触发器或存储过程。

3 个答案:

答案 0 :(得分:2)

您可以使用临时变量。

INSERT INTO `numbers`(`number`) VALUES (
  IF((@a := IFNULL((SELECT number FROM `numbers` AS n ORDER BY id DESC LIMIT 1), 0)) > 99, 1, @a + 1)
);

答案 1 :(得分:2)

尝试使用modulo %运算符

INSERT INTO `numbers` (`number`)
VALUES (
          IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) % 100 + 1
    )

答案 2 :(得分:1)

我明白了。模数的答案很好。它对我来说感觉“脆弱”,因为它无法处理所述的“100或更多”要求。如果您将要求更改为“如果最后一条记录的数字正好为100,则将数字设置为1”就可以了。

对我而言,这更直观:

INSERT INTO numbers (number)
SELECT 
  CASE 
    WHEN number >= 100 THEN 0
    ELSE COALESCE (number, 0)
  END + 1
FROM numbers
ORDER BY id DESC
LIMIT 1