Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在子查询中使用mySQL变量_Mysql - Fatal编程技术网

在子查询中使用mySQL变量

在子查询中使用mySQL变量,mysql,Mysql,我试图使用用户定义的变量来限制子查询的结果,以便获得某些分析数据中两个时间戳之间的差异。我正在使用的代码如下: SELECT @visitID := `s`.`visit_id` AS `visit_id`, # Get the visit ID and assign to a variable @dt := `s`.`dt` AS `visit`,

我试图使用用户定义的变量来限制子查询的结果,以便获得某些分析数据中两个时间戳之间的差异。我正在使用的代码如下:

SELECT  @visitID := `s`.`visit_id` AS `visit_id`,                             # Get the visit ID and assign to a variable
        @dt :=      `s`.`dt` AS `visit`,                                      # Get the timestamp of the visit and assign to a variable
                    `tmp`.`dt` AS `next-visit`                                # Get the 'next visit' timestamp which should be returned by the subquery

FROM `wp_slim_stats` AS `s`                                                   # From the main table...

LEFT JOIN (SELECT   `s`.`visit_id`,                                           # Start the subquery 
                    MIN(`s`.`dt`) as `dt`                                     # Get the lowest timestamp returned
               FROM `wp_slim_stats` AS `s`                                    # ...from the same table
               WHERE    `s`.`visit_id` = @visitID                             # Visit ID should be the same as the row the main query is working on
                   AND  `s`.`dt` > @dt                                        # Timestamp should be HIGHER than the row we are working on
               LIMIT 0, 1) as `tmp` ON `tmp`.`visit_id` = `s`.`visit_id`      # Join on visit_id

WHERE `s`.`resource` LIKE 'foo%'                                              # Limit all results to the page we are looking for
其目的是获取一个单独的页面视图,并记录其访问ID和时间戳。然后,子查询应该返回数据库中具有相同访问ID的下一条记录。然后,我可以从另一条记录中减去一条记录以获得在页面上花费的秒数

我遇到的问题是,子查询似乎正在为返回的每一行重新计算,并且直到结束时才填充下一个visit列。这意味着返回的所有行都与最终行的子查询结果相匹配,因此除了最后一行之外,所有下次访问列都为空

我期待的结果是:

_________________________________________________
| visit_id     |     visit     |      next-visit|
|--------------|---------------|----------------|
|      1       | 123456789     |  123457890     |
|--------------|---------------|----------------|
|      4       | 234567890     |  234567891     |
|--------------|---------------|----------------|
|      6       | 345678901     |  345678902     |
|--------------|---------------|----------------|
|      8       | 456789012     |  456789013     |
|______________|_______________|________________|
但是我越来越

_________________________________________________
| visit_id     |     visit     |      next-visit|
|--------------|---------------|----------------|
|      1       | 123456789     |  NULL          |
|--------------|---------------|----------------|
|      4       | 234567890     |  NULL          |
|--------------|---------------|----------------|
|      6       | 345678901     |  NULL          |
|--------------|---------------|----------------|
|      8       | 456789012     |  456789013     |
|______________|_______________|________________|
我对在mySQL中使用变量还是相当陌生的,尤其是在动态分配变量时。正如我所提到的,我认为我在某处弄乱了操作顺序,这导致子查询在末尾重新填充每一行

理想情况下,由于客户端的限制,我需要能够在纯mySQL中实现这一点,因此不幸的是,没有PHP。有可能做我想做的事吗


谢谢大家!

这里根本不需要变量

SELECT `s`.`visit_id` AS `visit_id`,                          
       `s`.`dt` AS `visit`,                                   
        (SELECT MIN(dt) FROM `wp_slim_stats` ws WHERE ws.visit_id = s.visit_id AND ws.dt > s.dt)
FROM `wp_slim_stats` AS `s`                                                
WHERE `s`.`resource` LIKE 'foo%'
要回答解决方案不起作用的原因,请查看sql查询中的操作顺序:

FROM子句 WHERE子句 分组依据子句 有从句 SELECT子句 按条款订货
这是您需要运行的查询

选择visits.visitid作为vId,temp.time作为tTime,visits.time作为vTime 从访问内部连接选择minid作为firstId、visitid、time from 按visitid访问v1组在访问时访问temp.visitid=temp.visitid,其中 id>temp.firstid组,按visits.visitid


太棒了!我显然已经考虑过这个问题了;关于操作顺序,子查询如何适应?它会经历主查询的6个阶段,然后是子查询,或者反过来,还是处理每个查询的from,然后是where from,等等?子查询位于主查询的select子句中,加上它是一个从属子查询,这意味着它的输出取决于主查询的值,因此,它将经历主查询的前5个阶段,然后是子查询的6个阶段,然后又是主查询的最后一个阶段。很酷,我将对此进行一次尝试。删除注释以避免误解,感谢@fancyPants的提示