sql >> Databáze >  >> RDS >> Mysql

Vyberte řádek a řádky kolem něj

Pouze jeden ORDER BY klauzuli lze definovat pro UNION 'd dotaz. Nezáleží na tom, zda používáte UNION nebo UNION ALL . MySQL podporuje LIMIT klauzule na částech UNION 'd dotazu, ale bez možnosti definovat pořadí je to relativně k ničemu.

MySQL také postrádá hodnotící funkce, které musíte řešit s mezerami v datech (chybějící kvůli mazání záznamů). Jedinou alternativou je použití inkrementační proměnné v příkazu SELECT:

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

Nyní můžeme získat postupně očíslovaný seznam řádků, takže můžeme použít:

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

Použití 7 jako hodnoty pro @midpoint, @midpoint - ROUND(@midpoint/2) vrátí hodnotu 4 . Chcete-li získat celkem 10 řádků, nastavte hodnotu @upperlimit na 10. Zde je úplný dotaz:

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

Pokud ale přesto chcete použít LIMIT , můžete použít:

  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


  1. MySQL:Automatické zvýšení dočasného sloupce v příkazu select

  2. Jak vytvořit alias pole nebo sloupce v MySQL?

  3. C# Entity Framework:Klíčové slovo není podporováno:'port'

  4. Přehled MariaDB Xpand (dříve ClustrixDB)