mysql强制结果的顺序与IN子句的顺序匹配
这个问题与关于按IN子句排序最终结果的问题不同 我想强制包含IN子句的查询返回的结果与IN子句的顺序匹配 我工作的地方 我想修改下面的查询,以便在按日期时间排序表单页面点击表时,在每个会话id的progress=4和progress=7之前出现包含progress=2的行 以下是当前查询: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
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/%'