Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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强制结果的顺序与IN子句的顺序匹配_Mysql_Sql Order By_Having_Sql In - Fatal编程技术网

mysql强制结果的顺序与IN子句的顺序匹配

mysql强制结果的顺序与IN子句的顺序匹配,mysql,sql-order-by,having,sql-in,Mysql,Sql Order By,Having,Sql In,这个问题与关于按IN子句排序最终结果的问题不同 我想强制包含IN子句的查询返回的结果与IN子句的顺序匹配 我工作的地方 我想修改下面的查询,以便在按日期时间排序表单页面点击表时,在每个会话id的progress=4和progress=7之前出现包含progress=2的行 以下是当前查询: SELECT COUNT(*) FROM ( SELECT session_id FROM formation_page_hits WHERE progress I

这个问题与关于按IN子句排序最终结果的问题不同

我想强制包含IN子句的查询返回的结果与IN子句的顺序匹配

我工作的地方

我想修改下面的查询,以便在按日期时间排序表单页面点击表时,在每个会话id的progress=4和progress=7之前出现包含progress=2的行

以下是当前查询:

SELECT  COUNT(*)
FROM    (
    SELECT  session_id
    FROM    formation_page_hits
    WHERE   progress IN (2, 4, 7)
            AND datetime >= '2011-03-23'
            AND datetime < '2011-03-24'
    GROUP BY
            session_id
    HAVING  COUNT(DISTINCT progress) = 3
    ) q
应与查询匹配,但:

datetime,               session_id, progress
('2011-03-01 01:02:11', 'abc',      4)
('2011-03-01 01:02:12', 'abc',      2)
('2011-03-01 01:02:13', 'abc',      7)
不应该是一场比赛

此外:

datetime,               session_id, progress
('2011-03-01 01:02:11', 'abc',      4)
('2011-03-01 01:02:12', 'abc',      2)
('2011-03-01 01:02:13', 'abc',      4)
('2011-03-01 01:02:14', 'abc',      7)

应该是匹配的。

更常见的方法是在升序日期时间使用双重自联接,以三向联接结束。然而,这并不是一个性能良好的查询

select *
from
(
    SELECT  session_id, group_concat(concat('|',progress,'/') order by datetime) list
    FROM    formation_page_hits
    WHERE   progress IN (2, 4, 7)
            AND datetime >= '2011-03-23'
            AND datetime < '2011-03-24'
    GROUP BY session_id
    HAVING  COUNT(DISTINCT progress) = 3
) X
where list like '%|2/%|4/%|7/%'

2,4,7是严格的升序。您的示例数据是特殊的还是希望始终使用升序?
select *
from
(
    SELECT  session_id, group_concat(concat('|',progress,'/') order by datetime) list
    FROM    formation_page_hits
    WHERE   progress IN (2, 4, 7)
            AND datetime >= '2011-03-23'
            AND datetime < '2011-03-24'
    GROUP BY session_id
    HAVING  COUNT(DISTINCT progress) = 3
) X
where list like '%|2/%|4/%|7/%'