Mysql if 中的 SQLselect 用户变量
Mysql SQLselect user-variable in if
以下句子中的用户定义变量非常有线,
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM my_table AS init
ORDER BY CatId, Date
如此处所示:http://sqlfiddle.com/#!2/fddbd/83,my_table 由以下公式给出:
CREATE TABLE my_table (
Id INT(6) UNSIGNED ZEROFILL,
CatId INT,
Date DATE,
Rate INT
);
INSERT INTO my_table
VALUES
(000001, 12, '2009-07-07', 1),
(000002, 12, '2009-07-08', 1),
(000003, 12, '2009-07-09', 1),
(000004, 12, '2009-07-10', 2),
(000005, 12, '2009-07-15', 1),
(000006, 12, '2009-07-16', 1),
(000007, 13, '2009-07-08', 1),
(000008, 13, '2009-07-09', 1),
(000009, 14, '2009-07-07', 2),
(000010, 14, '2009-07-08', 1),
(000010, 14, '2009-07-10', 1);
更准确地说,变量 @f
不是预定义的,mysql 对 DateDiff 的逻辑是什么?
在第一行,它将使用 NULL
作为所有变量的值。所以它等同于以下查询显式初始化它们
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM my_table AS init
CROSS JOIN (SELECT @f := NULL, @c := NULL, @d := NULL) AS vars
ORDER BY CatId, Date
一般不建议将ORDER BY
子句放在与处理相同的查询级别。 MySQL 根据 ORDER BY
中的列是否在 SELECT
子句中命名,以不同方式执行此操作。如果是,它会在 之后执行排序 生成所有结果,否则它会在处理它们之前使用它对 table 中的行进行排序。获取 predictable 结果的方法是使用子查询:
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM (SELECT *
FROM my_table
ORDER BY CatId, Date) AS init
CROSS JOIN (SELECT @f := NULL, @c := NULL, @d := NULL) AS vars
由于您在不同的 MySQL 版本上看到不同的结果,这也可能取决于版本。使用子查询应该使它始终如一地工作。
以下句子中的用户定义变量非常有线,
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM my_table AS init
ORDER BY CatId, Date
如此处所示:http://sqlfiddle.com/#!2/fddbd/83,my_table 由以下公式给出:
CREATE TABLE my_table (
Id INT(6) UNSIGNED ZEROFILL,
CatId INT,
Date DATE,
Rate INT
);
INSERT INTO my_table
VALUES
(000001, 12, '2009-07-07', 1),
(000002, 12, '2009-07-08', 1),
(000003, 12, '2009-07-09', 1),
(000004, 12, '2009-07-10', 2),
(000005, 12, '2009-07-15', 1),
(000006, 12, '2009-07-16', 1),
(000007, 13, '2009-07-08', 1),
(000008, 13, '2009-07-09', 1),
(000009, 14, '2009-07-07', 2),
(000010, 14, '2009-07-08', 1),
(000010, 14, '2009-07-10', 1);
更准确地说,变量 @f
不是预定义的,mysql 对 DateDiff 的逻辑是什么?
在第一行,它将使用 NULL
作为所有变量的值。所以它等同于以下查询显式初始化它们
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM my_table AS init
CROSS JOIN (SELECT @f := NULL, @c := NULL, @d := NULL) AS vars
ORDER BY CatId, Date
一般不建议将ORDER BY
子句放在与处理相同的查询级别。 MySQL 根据 ORDER BY
中的列是否在 SELECT
子句中命名,以不同方式执行此操作。如果是,它会在 之后执行排序 生成所有结果,否则它会在处理它们之前使用它对 table 中的行进行排序。获取 predictable 结果的方法是使用子查询:
SELECT
@f:=CONVERT(
IF(@c<=>CatId AND DATEDIFF(Date, @d)=1, @f, Date), DATE
) AS Begin,
@c:=CatId, @d:=Date
FROM (SELECT *
FROM my_table
ORDER BY CatId, Date) AS init
CROSS JOIN (SELECT @f := NULL, @c := NULL, @d := NULL) AS vars
由于您在不同的 MySQL 版本上看到不同的结果,这也可能取决于版本。使用子查询应该使它始终如一地工作。