<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Коментари на: MySQL OFFSET</title>
	<atom:link href="http://www.cphpvb.net/db/5513-mysql-offset/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cphpvb.net/db/5513-mysql-offset/</link>
	<description>дневникът на Филип Петров</description>
	<lastBuildDate>Wed, 01 Feb 2012 11:40:44 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>От: Филип Петров</title>
		<link>http://www.cphpvb.net/db/5513-mysql-offset/#comment-6383</link>
		<dc:creator>Филип Петров</dc:creator>
		<pubDate>Thu, 18 Mar 2010 09:24:34 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=5513#comment-6383</guid>
		<description>Това, което показваш, е просто съкратен запис. Аз лично предпочитам разширения, защото ясно указва с думи кое число какво е. Просто обичам да си описвам данните с думи :)

Впрочем не съм запознат тази функционалност как е реализирана в ANSI стандарта - по-склонен съм да вярвам, че я няма и се използват трикове с броене на ROWNUM (както в ORACLE) и подобни хитрости.

Ето как се прави алтернатива на LIMIT и OFFSET в няколко различни системи:

&lt;strong&gt;DB2&lt;/strong&gt;:
Доколкото знам няма оператор за OFFSET. За LIMIT се използва:
&lt;pre&gt;
SELECT id,name
FROM products
FETCH FIRST 10 ROWS ONLY;&lt;/pre&gt;

За постигане на OFFSET (подобно на ORACLE) се използва трик с rownum:

&lt;pre&gt;SELECT * 
FROM (
     SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS rn, id, name
     FROM products
     ORDER BY id ASC
) AS tblname
WHERE rn &gt; 100 AND rownum &lt;= 110&lt;/pre&gt;

&lt;strong&gt;MSSQL&lt;/strong&gt;:
Долколкото знам няма оператор за OFFSET. За LIMIT се използва:

&lt;pre&gt;SELECT TOP 10 id, name
FROM products;&lt;/pre&gt;

Ето начин за постигане на OFFSET с вложен SELECT:
&lt;pre&gt;SELECT TOP 10 id, name 
FROM products 
WHERE name NOT IN (
          SELECT TOP 100 name
          FROM products
);&lt;/pre&gt;

&lt;strong&gt;Informix, InterBase, Firebird&lt;/strong&gt;:

&lt;pre&gt;SELECT FIRST 10 SKIP 100 id, name
FROM products;&lt;/pre&gt;

&lt;strong&gt;Oracle&lt;/strong&gt;:
Няма нито LIMIT, нито OFFSET. За LIMIT може да се използва ROWNUM:
&lt;pre&gt;SELECT id, name
FROM products
WHERE ROWNUM&lt;=10;&lt;/pre&gt;

За съжаление ROWNUM не ни помага за постигане на функционалност на OFFSET. Условие като &quot;ROWNUM &gt;100 AND ROWNUM &lt;=110&quot; ще върне false още на първи ред и от там няма да продължи въобще. Затова за OFFSET се използва &quot;трик&quot;:

&lt;pre&gt;SELECT id, name 
FROM (
     SELECT id, name, ROW_NUMBER() OVER (ORDER BY id) AS rn
     FROM products
     ORDER BY id
)
WHERE rn &gt; 100 AND rn &lt;= 110;&lt;/pre&gt;
&lt;strong&gt;
POSTGRE и SQLLite&lt;/strong&gt;: Същото както при MySQL. При POSTGRE e валиден и съкратения запис, обаче в него числата са обърнати (т.е. ако в MySQL пишем LIMIT X,Y, то в POSTGRE пишем LIMIT Y,X)!!! Затова просто... хайде без съкратени записи моля :)</description>
		<content:encoded><![CDATA[<p>Това, което показваш, е просто съкратен запис. Аз лично предпочитам разширения, защото ясно указва с думи кое число какво е. Просто обичам да си описвам данните с думи :)</p>
<p>Впрочем не съм запознат тази функционалност как е реализирана в ANSI стандарта &#8211; по-склонен съм да вярвам, че я няма и се използват трикове с броене на ROWNUM (както в ORACLE) и подобни хитрости.</p>
<p>Ето как се прави алтернатива на LIMIT и OFFSET в няколко различни системи:</p>
<p><strong>DB2</strong>:<br />
Доколкото знам няма оператор за OFFSET. За LIMIT се използва:</p>
<pre>
SELECT id,name
FROM products
FETCH FIRST 10 ROWS ONLY;</pre>
<p>За постигане на OFFSET (подобно на ORACLE) се използва трик с rownum:</p>
<pre>SELECT *
FROM (
     SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS rn, id, name
     FROM products
     ORDER BY id ASC
) AS tblname
WHERE rn &gt; 100 AND rownum &lt;= 110</pre>
<p><strong>MSSQL</strong>:<br />
Долколкото знам няма оператор за OFFSET. За LIMIT се използва:</p>
<pre>SELECT TOP 10 id, name
FROM products;</pre>
<p>Ето начин за постигане на OFFSET с вложен SELECT:</p>
<pre>SELECT TOP 10 id, name
FROM products
WHERE name NOT IN (
          SELECT TOP 100 name
          FROM products
);</pre>
<p><strong>Informix, InterBase, Firebird</strong>:</p>
<pre>SELECT FIRST 10 SKIP 100 id, name
FROM products;</pre>
<p><strong>Oracle</strong>:<br />
Няма нито LIMIT, нито OFFSET. За LIMIT може да се използва ROWNUM:</p>
<pre>SELECT id, name
FROM products
WHERE ROWNUM&lt;=10;</pre>
<p>За съжаление ROWNUM не ни помага за постигане на функционалност на OFFSET. Условие като &#8222;ROWNUM &gt;100 AND ROWNUM &lt;=110&#8243; ще върне false още на първи ред и от там няма да продължи въобще. Затова за OFFSET се използва &#8222;трик&#8220;:</p>
<pre>SELECT id, name
FROM (
     SELECT id, name, ROW_NUMBER() OVER (ORDER BY id) AS rn
     FROM products
     ORDER BY id
)
WHERE rn &gt; 100 AND rn &lt;= 110;</pre>
<p><strong><br />
POSTGRE и SQLLite</strong>: Същото както при MySQL. При POSTGRE e валиден и съкратения запис, обаче в него числата са обърнати (т.е. ако в MySQL пишем LIMIT X,Y, то в POSTGRE пишем LIMIT Y,X)!!! Затова просто&#8230; хайде без съкратени записи моля :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Иван</title>
		<link>http://www.cphpvb.net/db/5513-mysql-offset/#comment-6382</link>
		<dc:creator>Иван</dc:creator>
		<pubDate>Thu, 18 Mar 2010 07:16:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=5513#comment-6382</guid>
		<description>По-често се пише
LIMIT X,Y
вместо
LIMIT Y OFFSET X</description>
		<content:encoded><![CDATA[<p>По-често се пише<br />
LIMIT X,Y<br />
вместо<br />
LIMIT Y OFFSET X</p>
]]></content:encoded>
	</item>
</channel>
</rss>

