- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个相当不寻常的问题,它是在从本地环境移动到暂存服务器时出现的。 MySQL 版本不同,但我找不到发生此问题的任何原因。
我使用的代码是:
DECLARE _first_event_time datetime;
SELECT event_time INTO _first_event_time
FROM session_events
WHERE session_id = _session_id
ORDER BY event_id ASC LIMIT 0,1;
-- Select Data
SELECT event_id,
event_time,
timediff(event_time, _first_event_time) AS event_time_from_start,
(@previous := unix_timestamp(event_time) - @previous) AS event_duration,
(@previous := unix_timestamp(event_time)) AS previous_event_timestamp
FROM session_events e,
(SELECT @previous:=0) c
ORDER BY event_id ASC LIMIT 0, 400;
我期望的是以下结果,这是我在运行 MAMP 的 DEV 版本上运行 5.5 时得到的结果:
+----------+------------------+-----------------------+----------------+--------------------------+
| event_id | event_time | event_time_from_start | event_duration | previous_event_timestamp |
+----------+------------------+-----------------------+----------------+--------------------------+
| 5074 | 24/09/2015 20:35 | 00:00:00 | 1443123315 | 1443123315 |
| 5075 | 24/09/2015 20:35 | 00:00:02 | 2 | 1443123317 |
| 5076 | 24/09/2015 20:35 | 00:00:03 | 1 | 1443123318 |
| 5077 | 24/09/2015 20:35 | 00:00:03 | 0 | 1443123318 |
| 5078 | 24/09/2015 20:35 | 00:00:04 | 1 | 1443123319 |
| 5079 | 24/09/2015 20:35 | 00:00:05 | 1 | 1443123320 |
| 5080 | 24/09/2015 20:35 | 00:00:06 | 1 | 1443123321 |
| 5081 | 24/09/2015 20:35 | 00:00:06 | 0 | 1443123321 |
| 5082 | 24/09/2015 20:35 | 00:00:07 | 1 | 1443123322 |
| 5083 | 24/09/2015 20:35 | 00:00:08 | 1 | 1443123323 |
| 5084 | 24/09/2015 20:35 | 00:00:09 | 1 | 1443123324 |
| 5085 | 24/09/2015 20:35 | 00:00:10 | 1 | 1443123325 |
+----------+------------------+-----------------------+----------------+--------------------------+
但是数据是这样出来的(请注意数据值不同,因为我在两台服务器上创建了相同的值但是你可以看到数据在哪里被偏移,存储过程中的代码是相同的在两台服务器上):
+----------+------------------+-----------------------+----------------+--------------------------+
| event_id | event_time | event_time_from_start | event_duration | previous_event_timestamp |
+----------+------------------+-----------------------+----------------+--------------------------+
| 5307 | 24/09/2015 20:32 | 00:00:00 | -17 | 1443123174 |
| 5308 | 24/09/2015 20:33 | 00:00:07 | 1443123181 | 1443123181 |
| 5309 | 24/09/2015 20:33 | 00:00:08 | -7 | 1443123182 |
| 5310 | 24/09/2015 20:33 | 00:00:09 | 2 | 1443123183 |
| 5311 | 24/09/2015 20:33 | 00:00:11 | 3 | 1443123185 |
| 5312 | 24/09/2015 20:33 | 00:00:12 | 3 | 1443123186 |
| 5313 | 24/09/2015 20:33 | 00:00:13 | 2 | 1443123187 |
| 5314 | 24/09/2015 20:33 | 00:00:14 | 2 | 1443123188 |
| 5315 | 24/09/2015 20:33 | 00:00:15 | 2 | 1443123189 |
| 5316 | 24/09/2015 20:33 | 00:00:15 | 1 | 1443123189 |
| 5317 | 24/09/2015 20:33 | 00:00:17 | 2 | 1443123191 |
| 5318 | 24/09/2015 20:33 | 00:00:18 | 18 | 1443123192 |
+----------+------------------+-----------------------+----------------+--------------------------+
时区应该没有什么区别,因为这是从数据和存储过程运行的。我还尝试使用以下方法从时间戳更改为仅使用 datediff:
, ( TIME_TO_SEC(TIMEDIFF(event_time, @previous))) AS event_duration
, ( @previous := event_time ) AS previous_event_timestamp
进一步研究一下,问题似乎出在 ORDER BY 子句的某个地方,当在此服务器上初始运行时填充 @previous 字段时,它似乎以未排序的顺序选择结果,就好像我删除了 ORDER BY 子句,并将 @previous 设置为 event_time,然后该顺序就是导致问题的顺序。
如果我只运行一个不带@previous 和 ORDER BY 子句的 select 语句,5.6 服务器返回的数据集似乎与第二个示例中显示的不寻常顺序匹配,其中 @previous 似乎在选择随机值。
我只能认为 SELECT 语句中运行数据并设置 @previous 值的部分首先运行,然后当它返回数据时运行 ORDER BY,这就是问题的来源。
查看 MySQL 手册,我没有发现任何介于 5.5 和 5.6 之间的东西(至少不是我能够归因于发生这种情况的原因)。我想有一种方法可以让它发挥作用。
任何建议将不胜感激,因为我无法弄清楚为什么它按照 ORDER BY 子句之前的顺序进行选举。
最佳答案
MySQL 明确警告不要在同一个select
的不同表达式中使用变量和分配它们。我建议您使用子查询来执行此操作:
SELECT t.*,
(unix_timestamp(event_time) - previous_event_timestamp) as event_duration
FROM (SELECT event_id, event_time,
timediff(event_time, _first_event_time) AS event_time_from_start,
if((@pp := @p) = null, null, -- never happens
if(@p := unix_timestamp(event_time), @pp, @pp)
) AS previous_event_timestamp
FROM session_events e CROSS JOIN
(SELECT @p := 0, @pp := 0) c
ORDER BY event_id ASC
LIMIT 0, 400
) t;
if
逻辑只是将赋值放在同一语句中的一种方式。第一个将 @pp
指定为当前的先前值(在 @p
中)。第二次重新赋值@p
,然后返回@pp
。
然后外部查询对该值进行计算。
As a general rule, other than in SET statements, you should never assign a value to a user variable and read the value within the same statement.
最好避免文档明确警告不要使用的“功能”。
关于mysql - 用户变量从上一行中选择值在 MySQL 5.5 中很好,但在 5.6 中它似乎以不同的顺序运行查询的 SELECT 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32973350/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!