<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; numerowanie wierszy</title>
	<atom:link href="https://blog.visionsoftware.pl/tag/numerowanie-wierszy/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Numerowanie wierszy w MySQL</title>
		<link>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html</link>
		<comments>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html#comments</comments>
		<pubDate>Sat, 30 Jun 2012 20:17:28 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[numerowanie wierszy]]></category>
		<category><![CDATA[raport]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=610</guid>
		<description><![CDATA[Tworząc raport zawierający określoną liczbę wierszy, dobrym pomysłem jest ich ponumerowanie. Stosując prostą sztuczkę możemy to zrobić bezpośrednio w MySQL, pomijając dodatkową obróbkę danych w edytorze tekstowym lub arkuszu kalkulacyjnym. Wystarczy w tym celu skorzystać ze zmiennych. Rozwiązanie problemu numerowania wierszy w MySQL jest niezwykle proste. Wystarczy zdefiniować zmienną globalną, która będzie przechowywać licznik i wyświetlić ją jako argument polecenia SELECT. Może to wyglądać w następujący sposób: Niestety, sytuacja zaczyna się komplikować, gdy rozbudujemy zapytanie. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Tworząc raport zawierający określoną liczbę wierszy, dobrym pomysłem jest ich ponumerowanie. Stosując prostą sztuczkę możemy to zrobić bezpośrednio w MySQL, pomijając dodatkową obróbkę danych w edytorze tekstowym lub arkuszu kalkulacyjnym. Wystarczy w tym celu skorzystać ze zmiennych. <span id="more-610"></span></p>
<p>Rozwiązanie problemu numerowania wierszy w MySQL jest niezwykle proste. Wystarczy zdefiniować zmienną globalną, która będzie przechowywać licznik i wyświetlić ją jako argument polecenia <code>SELECT</code>. Może to wyglądać w następujący sposób:</p>
<pre class="brush: sql; title: ; notranslate">
set @row = 0;
select @row := @row + 1 as &quot;Lp.&quot;,
imie,
nazwisko
from klienci
</pre>
<p>Niestety, sytuacja zaczyna się komplikować, gdy rozbudujemy zapytanie. Wzbogacając je o złączenia, klauzulę <code>WHERE</code> oraz sortowania, możemy spodziewać się błędnego numerowania wierszy. Widać to na poniższym przykładzie pobierania danych dotyczących statystyk odwiedzin strony www:</p>
<pre class="brush: sql; title: ; notranslate">
SET @a:=0;
SELECT @a:=@a+1 AS &quot;row&quot;,
IP
FROM `stats` st JOIN
`sources` so ON st.source_id = st.source_id
WHERE st.created_at BETWEEN &quot;2011-01-01 00:000:00&quot; AND &quot;2011-01-01 23:59:59&quot;
AND st.IP LIKE &quot;1%&quot;
AND st.source_id=1
ORDER BY st.IP
</pre>
<p>Wynik takiego wywołania będzie następujący:</p>
<pre>
row     IP
------  ---------------
77      100.113.10.222
50      100.113.10.222
23      100.113.10.222
60      104.87.121.89
33      104.87.121.89
6       104.87.121.89
[…]
</pre>
<p>Sposobem na rozwiązanie tego problemu będzie podzapytanie w klauzuli <code>FROM</code>. Wystarczy umieścić numerowanie wierszy w zewnętrznym zapytaniu i dodać do niego pozostałe interesujące nas kolumny, które będą pobierane z wewnętrznego zapytania, odpowiedzialnego za filtrowanie oraz sortowanie. Zapytanie SQL po modyfikacji może więc wyglądać w następujący sposób:</p>
<pre class="brush: sql; title: ; notranslate">
SET @a:=0;
SELECT @a:=@a+1, IP FROM (
SELECT st.IP
FROM `stats` st JOIN
`sources` so ON st.source_id = st.source_id
WHERE st.created_at BETWEEN &quot;2011-01-01 00:000:00&quot; AND &quot;2011-01-01 23:59:59&quot;
AND st.IP LIKE &quot;1%&quot;
AND st.source_id=1
ORDER BY st.IP
) AS sub
</pre>
<p>Numerowanie wierszy w wyniku powyższej modyfikacji będzie poprawne:</p>
<pre>
row     IP
------  ---------------
1       100.113.10.222
2       100.113.10.222
3       100.113.10.222
4       104.87.121.89
5       104.87.121.89
6       104.87.121.89
[...]
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
