0

この質問は、IN句による最終結果の順序付けに関してよく寄せられる質問とは異なります。

IN句を含むクエリによって返される結果を、IN句の順序と一致させるように強制したいと思います。

これは私が取り組んでいる元の質問です。

以下のクエリを変更して、テーブルを。で並べ替えるときに、を含む行がそれぞれのprogress=2progress=4progress=7ごとに発生するようにします。session_idformation_page_hitsdatetime

現在のクエリは次のとおりです。

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)

一致する必要があります。

4

1 に答える 1

1

より一般的な方法は、自己参加を2回行って、日時の昇順で3方向の参加を行うことです。ただし、これはパフォーマンスの高いクエリではありません。

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/%'
于 2011-03-29T11:04:25.047 に答える