Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie eine Reihe und Reihen darum herum aus

Nur ein ORDER BY -Klausel kann für eine UNION definiert werden würde fragen. Es spielt keine Rolle, ob Sie UNION verwenden oder UNION ALL . MySQL unterstützt das LIMIT -Klausel für Teile einer UNION würde abfragen, aber es ist relativ nutzlos ohne die Fähigkeit, die Reihenfolge zu definieren.

MySQL fehlen auch Ranking-Funktionen, die Sie benötigen, um Lücken in den Daten zu schließen (fehlen aufgrund von gelöschten Einträgen). Die einzige Alternative besteht darin, eine inkrementierende Variable in der SELECT-Anweisung zu verwenden:

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

Jetzt können wir eine fortlaufend nummerierte Liste der Zeilen erhalten, also können wir verwenden:

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

Verwenden Sie 7 als Wert für @midpoint, @midpoint - ROUND(@midpoint/2) gibt einen Wert von 4 zurück . Um insgesamt 10 Zeilen zu erhalten, setzen Sie den @upperlimit-Wert auf 10. Hier ist die vollständige Abfrage:

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

Aber wenn Sie trotzdem LIMIT verwenden möchten , können Sie verwenden:

  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