MySQL Force Order of Résultats trouvé pour correspondre à l'ordre de la clause
-
14-11-2019 - |
Question
Cette question est différente de un Question communément posée sur la commande des résultats finaux par la clause en.
Je voudrais forcer les résultats renvoyés par la requête qui contient la clause in, pour correspondre à l'ordre de la clause in.
C'est la question initiale que je travaille.
Je voudrais modifier la requête ci-dessous pour qu'une ligne contenant progress=2
se produit avant progress=4
et progress=7
pour chaque session_id
Lors de la commande du formation_page_hits
passer datetime
.
Voici la requête actuelle:
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
Ces entrées
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)
devrait être un match pour la requête, mais:
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)
ne devrait pas être un match.
En outre:
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)
devrait être un match.
La solution
La manière la plus courante est de doubler l'auto-jointure pour se retrouver avec une jointure à trois voies sur l'heure de date ascendante. Cependant, ce n'est pas une requête bien performante.
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/%'