mysql принудительный порядок найденных результатов, совпадающий с порядком предложения IN - PullRequest
0 голосов
/ 29 марта 2011

Этот вопрос отличается от часто задаваемого вопроса об упорядочении окончательных результатов по предложению IN.

Я бы хотел, чтобы результаты, возвращаемые запросом, содержащим предложение IN, соответствовали порядку предложения IN.

Это оригинальный вопрос , с которым я работаю.

Я бы хотел изменить запрос ниже, чтобы строка, содержащая progress=2, находилась до progress=4 и progress=7 для каждого session_id при упорядочении таблицы formation_page_hits по datetime.

Вот текущий запрос:

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)

должно совпадать.

1 Ответ

1 голос
/ 29 марта 2011

Более распространенный способ - двойное самостоятельное объединение, чтобы в конечном итоге получить трехстороннее объединение во время восходящей даты.Это, однако, вряд ли хорошо выполняет запрос.

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