像查询为什么SELECT (@sum:=(@var:=@sum)+some_table.val)...自动转换(@var:=@sum)到整数MySQL的≤5.5为DECIMAL型some_table.val和地板它DOUBLE/FLOAT?更改了哪些功能以允许5.6中的预期行为?
请考虑下表:
CREATE TABLE t (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
sum_component FLOAT
);
INSERT INTO t (sum_component) VALUES (0.5), (0.6), (0.4), (0.5);
Run Code Online (Sandbox Code Playgroud)
我正在设计一个累积和查询,它获取id累积和大于某个值的条目.通常,此查询符合条例草案:
SELECT t.id,
@cumulative_sum
FROM t
CROSS JOIN (SELECT @cumulative_sum:=0) a
WHERE (@cumulative_sum:=@cumulative_sum+t.sum_component) > 1.3
ORDER BY id ASC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
...但我碰巧还需要在所选条目之前存储累积总和以及以后的计算,并且cumulative_sum从该查询中不返回预期结果,重复计算最后一个条目.在这种情况下,我希望此查询设置一个存储value 1.1(0.5 + 0.6)的变量,而不必进行额外的数学运算.
如果我在增量步骤中指定@cumulative_sumto 的旧值@another_variable,我应该能够做到这一点.
SELECT t.id,
@cumulative_sum …Run Code Online (Sandbox Code Playgroud) 为了理解和利用GHC自动记忆,我碰壁了:当纯函数以诸如的固定值调用时fib 42,它们有时又快又慢。如果fib 42通过数学简单地或隐式地调用它们,则它们会有所不同(\x -> fib (x - 1)) 43。这些案件似乎没有押韵或理由,因此我将向他们提出这些案件的目的是询问行为背后的逻辑是什么。
考虑一个慢速的斐波那契实现,这使备忘录有效时显而易见:
slow_fib :: Int -> Integer
slow_fib n = if n < 2 then 1 else (slow_fib (n - 1)) + (slow_fib (n - 2))
Run Code Online (Sandbox Code Playgroud)
我测试了三个基本问题,以查看GHC(8.2.2版)是否可以使用固定参数来记录调用:
slow_fib访问以前的顶级通话slow_fib吗?答案似乎是:
最后一种情况有效的事实令我感到困惑:例如,如果我可以重印结果,那么我应该希望能够添加它们。这是显示此代码的代码:
main = do
-- 1. all three of these are slow, even though `slow_fib 37` is
-- just the sum of the other two results. Definitely no …Run Code Online (Sandbox Code Playgroud) 以下提出了投诉:
interface IInvariant<TInv> {}
interface ICovariant<out TCov> {
IInvariant<TCov> M(); // The covariant type parameter `TCov'
// must be invariantly valid on
// `ICovariant<TCov>.M()'
}
interface IContravariant<in TCon> {
void M(IInvariant<TCon> v); // The contravariant type parameter
// `TCon' must be invariantly valid
// on `IContravariant<TCon>.M()'
}
Run Code Online (Sandbox Code Playgroud)
但我无法想象这不会是类型安全的.(剪断*)这是不允许这样做的原因,还是有其他违反类型安全的情况我不知道?
*我最初的想法确实令人费解,但尽管如此,答案非常彻底,@ Theodoros Chatzigiannakis甚至以令人印象深刻的准确性解剖了我的初步假设.
除了回顾过去的好评之外,我意识到我错误地认为类型签名ICovariant::M仍然是一个Func<IInvariant<Derived>>当它ICovariant<Derived>被分配给a时ICovariant<Base>.然后,该分配M到Func<IInvariant<Base>>会看起来罚款来自未来ICovariant<Base>,但当然会是非法的.为什么不禁止最后这个显然是非法的演员?(所以我认为)
正如埃里克·利珀特(Eric Lippert)所指出的那样,我觉得这种错误和切向猜测会减少这个问题,但出于历史目的,这个被剪切的部分:
对我来说最直观的解释是,以
ICovariant协变为例,TCov …
我有一个应用程序从表中选择加权随机条目,其中前缀总和(权重)是关键部分.简化的表定义如下所示:
CREATE TABLE entries (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
weight DECIMAL(9, 3),
fenwick DECIMAL(9, 3)
) ENGINE=MEMORY;
Run Code Online (Sandbox Code Playgroud)
其中`fenwick`存储Fenwick树表示中的值`weights`.
让每个条目的"范围"跨越其前缀和与其前缀sum +其权重之间.应用程序必须@r在0和之间生成一个随机数,SUM(weight)并查找其范围包含的条目@r,如下所示:

Fenwick树,结合MEMORY引擎和二进制搜索,应该允许我及时找到合适的条目O(lg^2(n)),而不是O(n)天真查询的时间:
SELECT a.id-1 FROM (SELECT *, (@x:=@x+weight) AS counter FROM entries
CROSS JOIN (SELECT @x:=0) a
HAVING counter>@r LIMIT 1) a;
Run Code Online (Sandbox Code Playgroud)
由于多个查询的开销,我一直在尝试将前缀sum操作压缩成一个查询(而不是脚本语言中的几个数组访问).在这个过程中,我意识到传统的求和方法,即涉及按降序键顺序访问元素,只会求和第一个元素.我怀疑MySQL在WHERE子句中存在变量时会线性地运行表.这是查询:
SELECT
SUM(1) INTO @garbage
FROM entries
CROSS JOIN (
SELECT @sum:=0,
@n:=@entryid
) …Run Code Online (Sandbox Code Playgroud) 我对下面的类型检查器的严格性感到有点困惑 - 似乎不变的T位置Inv[T]在Variantish参数列表中也是不变的:
scala> class Inv[T]
defined class Inv
scala> class Variantish[+T, +TVar <: Inv[T]]
<console>:12: error: covariant type T occurs in invariant position in type <: Inv[T] of type TVar
class Variantish[+T, +TVar <: Inv[T]]
^
Run Code Online (Sandbox Code Playgroud)
变体类型通常可以合法地出现在不变的参数列表位置,例如具有对象保护的可见性:
class Variantish[+T](protected[this] var v: Inv[T])
Run Code Online (Sandbox Code Playgroud)
并且似乎以下类似于类型安全:
class Variantish[+T, +TVar <: Inv[T]](protected[this] var v: TVar)
Run Code Online (Sandbox Code Playgroud)
需要上面提到的检查是如此严格?
为了节省空间,我在所有项目的公共父目录中安装了大型软件包。这些项目中的脚本可以引用此父目录中的模块(请参阅Node\ 的文档),但npm install在新克隆的项目中 -ing 会拉取所有内容,而不仅仅是项目在继承的项目之上需要的模块来自共同的父母。是否有任何选项可以npm install只下载需要的内容?
最小示例:考虑以下文件结构。
\n\n\xe2\x94\x9c projects\n\xe2\x94\x82 \xe2\x94\x9c package.json <- specifies a dependency on `some_module^1.0.0`\n\xe2\x94\x82 \xe2\x94\x9c node_modules\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94 some_module\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94 ...\n\xe2\x94\x82 \xe2\x94\x94 some_project\n\xe2\x94\x82 \xe2\x94\x94 package.json <- also specifies a dependency on `some_module^1.0.0`\nRun Code Online (Sandbox Code Playgroud)\n\n如果npm install运行在projects/some_project,它将下载some_module无条件下载。
(注:这与npm dedupe,因为这只是一个目录层次结构:父目录项目不依赖于任何子文件夹。)
在 SELECT 子句具有列别名的查询中尝试将 INSERT、SELECT 和 ON DUPLICATE KEY 链接在一起时,我遇到了一个相当令人惊讶的障碍。例如,请考虑以下情况:
表:
CREATE TABLE source (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
v INT NOT NULL
);
INSERT INTO source (v) VALUES (1), (2), (3);
CREATE TABLE dest (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
v INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
假设我正在尝试填充dest.v值,POW(source.v,2)而不管值是否dest已经存在。当然,我试过:
INSERT INTO dest
SELECT id, POW(v, 2) AS p FROM source
ON DUPLICATE KEY UPDATE dest.v=source.p;
Run Code Online (Sandbox Code Playgroud)
但是,MySQL 坚持认为 source.p 不存在:
错误 1054 …
我试图通过考虑内联样式和类样式来确定哪种样式适用于元素。Javascript 将这两者解析为对象,但未设置的样式是空字符串,而不是undefined. 如果“空”样式(例如width:;)没有任何效果,无论规则多么具体,那么我的目标就微不足道了。
但是,为了display:none动态覆盖默认规则,我知道这是document.getElementById('ele').style.display = '';可行的,虽然我知道它实际上并没有添加display内联样式,但在 CSS 中设置为空时是否有任何样式确实有效?如果是这种情况,我必须手动解析样式和样式表字符串以查看该属性是否已定义。
在之前关于泛型方差的问题中,我被告知IEnumerable<T>可以修改成员.如何做到这一点,并且当可以修改协变类型时出现方差违规,那么如何IEnumerable<T>协变T呢?
mysql ×3
c# ×2
generics ×2
select ×2
collections ×1
covariance ×1
css ×1
dependencies ×1
fenwick-tree ×1
ghc ×1
haskell ×1
indexing ×1
insert ×1
invariance ×1
javascript ×1
mariadb ×1
memoization ×1
npm ×1
range-query ×1
scala ×1
sql-update ×1