Question

J'ai cette instruction SQL:

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY date ASC, priority DESC

Ceci ne fait que commander par date, mais je souhaite donner à ma colonne "priorité". plus d'autorité. Comment puis-je faire ceci?

Il faut d'abord classer par date, mais si le temps entre deux enregistrements est de 10 minutes, je souhaite que la priorité prenne le dessus. Comment puis-je faire cela dans mon instruction SQL ou est-ce que cela doit être dans ma logique d'application? J'espérais pouvoir le faire dans mon instruction SQL.

Merci à tous pour toute aide

Était-ce utile?

La solution

Vous pouvez quantifier la commande par "date" en tranches de 10 minutes, alors pourquoi ne pas commander par étage (unix_timestamp (date) / 600), puis par priorité

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY floor(unix_timestamp(date)/600) ASC, priority DESC

Bien que deux dates puissent être séparées de moins de 10 minutes mais chevauchent deux "morceaux" de 10 minutes différents. C’est peut-être suffisant, mais je pense qu’il est préférable de faire ce que vous demandez.

(OP a demandé une explication plus détaillée ....)

Prenez deux fois qui chevauchent une limite de dix minutes, comme aujourd'hui 9h09 et 9h11:

  • floor (unix_timestamp ('2009-03-16 09: 09 : 00') / 600) = 2061990
  • floor (unix_timestamp ('2009-03-16 09: 11 : 00') / 600) = 2061991

Supposons que vous ayez une rangée de priorité plus élevée pour 09h11 que pour 09h09 - elle apparaîtra toujours après la ligne de 09h09 car elle est tombée dans le bloc de 10 minutes suivant, même si c'était seulement 2 minutes différentes.

Cette approche est donc approximative, mais ne résout pas le problème énoncé à l'origine.

De la manière dont vous avez énoncé votre problème, une rangée de priorité élevée peut apparaître avant celle enregistrée plusieurs heures (ou jours ou mois!) plus tôt, dans la mesure où il existe une série ininterrompue de rangées de priorité inférieure avec un intervalle inférieur à 10 minutes.

Autres conseils

Une autre variante serait:

SELECT * FROM converts 
WHERE email='myemail@googlemail.com' AND status!='1' 
ORDER BY (unix_timestamp(date)/60) - priority 

Ce n'est toujours pas exactement ce dont vous aviez besoin, mais plutôt proche.

En supposant que vous vouliez vraiment dire que "le temps entre deux enregistrements est de 10 minutes [ou moins], je souhaite que la priorité soit prise en compte?

puis triez par blocs de dix minutes, puis par priorité ...

Sélectionnez ...
Ordre par DateDiff (min, 0, Date) / 10, Priorité

vous pouvez ajuster la valeur 0 pour contrôler l’endroit où chaque "bloc minutes" commence et arrête ... Si MySql n'a pas de fonction DateDiff, utilisez n'importe quelle expression dans MySQL fournissant un nombre de minutes depuis un certain temps de référence ...

Si vous utilisez SQL Server 2005/2008, vous pouvez accomplir cette tâche avec un CTE récursif. Veuillez noter que j'ai écrit ce texte dans le bloc-notes et qu'il n'a pas encore été testé. Une fois que j’ai une chance de tester les résultats de la requête, je mettrai à jour le CTE en cas d’erreur ou supprimerai ce commentaire.

WITH date_cte

AS

(SELECT *
    , 'sequential_order' = ROW_NUMBER() OVER
        (PARTITION BY email
        ORDER BY date ASC, priority DESC)
FROM converts
WHERE email = 'myemail@googlemail.com'
AND status <> '1')

, recursive_date_cte

AS

(SELECT dc1.*
    , 'sort_level' = 1
FROM date_cte dc1
WHERE sequential_order = 1
UNION
SELECT dc1.*
    , 'sort_level' = CASE
        WHEN DATEDIFF(MINUTE, dc1.date, dc2.date) <= 10 THEN sort_level
        ELSE sort_level + 1 END
LEFT JOIN date_cte dc2
    ON dc1.sequential_order = dc2.sequential_order - 1
WHERE dc1.sequential_order > 1)

SELECT *

FROM recursive_date_cte

ORDER BY sort_level ASC

, priority DESC

changez simplement l'ordre ou les colonnes de l'instruction de commande

SELECT * FROM converts WHERE email='myemail@googlemail.com' AND status!='1' ORDER BY priority DESC, date ASC
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top