2011-03-29 56 views
0

此问题与commonly asked question有关,通过IN子句排序最终结果。mysql强制结果的顺序与IN子句的顺序匹配

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

This is the original question我工作。

我想改变下面的查询,以使得包含progress=2行由datetime订购formation_page_hits表时progress=4progress=7每个session_id之前发生。

下面是当前查询:

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',  2) 
('2011-03-01 01:02:12', 'abc',  4) 
('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',  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) 

应该是匹配的。

+0

(2,4,7)严格按升序排列。您的示例数据是否特殊,或者您希望始终使用升序? – vbence 2011-03-29 11:39:14

回答

1

更常见的方法是将自连接加倍,最终以三向加入ON升序日期时间结束。但是,这并不是一个表现良好的查询。

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/%'