gpt4 book ai didi

Mysql SQLselect if 中的用户变量

转载 作者:行者123 更新时间:2023-11-29 12:27:25 26 4
gpt4 key购买 nike

下面这句话中的用户定义变量是非常连线的,

  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 子句中命名。如果是,它会在生成所有结果之后执行排序,否则它会在处理表中的行之前使用它对它们进行排序。获得可预测结果的方法是使用子查询:

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 版本上看到不同的结果,因此这也可能取决于版本。使用子查询应该可以使其一致地工作。

关于Mysql SQLselect if 中的用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28103825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com