Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionnez une ligne et les lignes qui l'entourent

Un seul ORDER BY la clause peut être définie pour un UNION 'd requête. Peu importe si vous utilisez UNION ou UNION ALL . MySQL prend en charge la LIMIT clause sur des portions d'un UNION 'd requête, mais c'est relativement inutile sans la possibilité de définir l'ordre.

MySQL manque également de fonctions de classement, dont vous avez besoin pour gérer les lacunes dans les données (manquantes en raison de la suppression d'entrées). La seule alternative est d'utiliser une variable d'incrémentation dans l'instruction SELECT :

SELECT t.id, 
       @rownum := @rownum+1 as rownum 
  FROM MEDIA t, (SELECT @rownum := 0) r

Nous pouvons maintenant obtenir une liste numérotée consécutivement des lignes, nous pouvons donc utiliser :

WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2) 
                 AND @midpoint - ROUND(@midpoint/2) [email protected]

En utilisant 7 comme valeur pour @midpoint, @midpoint - ROUND(@midpoint/2) renvoie une valeur de 4 . Pour obtenir 10 lignes au total, définissez la valeur @upperlimit sur 10. Voici la requête complète :

SELECT x.* 
  FROM (SELECT t.id, 
               @rownum := @rownum+1 as rownum 
          FROM MEDIA t, 
               (SELECT @rownum := 0) r) x
 WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit

Mais si vous souhaitez toujours utiliser LIMIT , vous pouvez utiliser :

  SELECT x.* 
    FROM (SELECT t.id, 
                 @rownum := @rownum+1 as rownum 
            FROM MEDIA t, 
                 (SELECT @rownum := 0) r) x
   WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
   LIMIT 10