sql >> Database >  >> RDS >> Mysql

Selecteer een rij en rijen eromheen

Slechts één ORDER BY clausule kan worden gedefinieerd voor een UNION zou vragen. Het maakt niet uit of je UNION . gebruikt of UNION ALL . MySQL ondersteunt de LIMIT clausule op delen van een UNION 'd query, maar het is relatief nutteloos zonder de mogelijkheid om de volgorde te definiëren.

MySQL mist ook rangschikkingsfuncties, die u nodig hebt om hiaten in de gegevens op te lossen (ontbrekend omdat vermeldingen worden verwijderd). Het enige alternatief is om een ​​oplopende variabele te gebruiken in de SELECT-instructie:

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

Nu kunnen we een opeenvolgend genummerde lijst van de rijen krijgen, zodat we het volgende kunnen gebruiken:

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

Gebruik 7 als waarde voor @midpoint, @midpoint - ROUND(@midpoint/2) retourneert een waarde van 4 . Om in totaal 10 rijen te krijgen, stelt u de @upperlimit-waarde in op 10. Dit is de volledige zoekopdracht:

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

Maar als je nog steeds LIMIT wilt gebruiken , kunt u gebruiken:

  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. Hoe de waarde SQL_CALC_FOUND_ROWS te krijgen met behulp van voorbereide instructies?

  2. Waarom is IS NOT NULL false bij het controleren van een rijtype?

  3. Implementatie van Levenshtein-afstand voor mysql/fuzzy zoeken?

  4. Hoe kan ik een volledige lijst krijgen van alle query's die momenteel op mijn MySQL-server worden uitgevoerd?