<?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"
	>

<channel>
	<title>DeBlog</title>
	<atom:link href="http://blog.desmart.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.desmart.com</link>
	<description></description>
	<pubDate>Tue, 26 Jan 2010 11:10:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>SIGNED vs UNSIGNED w MySQL</title>
		<link>http://blog.desmart.com/2010/01/26/signed-vs-unsigned-w-mysql/</link>
		<comments>http://blog.desmart.com/2010/01/26/signed-vs-unsigned-w-mysql/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 11:10:48 +0000</pubDate>
		<dc:creator>birkin</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=105</guid>
		<description><![CDATA[Odejmowanie w MySQL&#8217;u wydaje się być proste. No bo jaka może być filozofia w odejmowaniu jednej liczby od drugiej, zwłaszcza że obie są typu INT? Jeden przypadek sprawił, że jednak wcale nie jest tak do końca oczywiste.
Załóżmy, że mamy w bazie dwie tabelki X i Y:

CREATE TABLE X (
id_y INT(10) UNSIGNED NOT NULL,
amount INT(10) UNSIGNED [...]]]></description>
			<content:encoded><![CDATA[<p>Odejmowanie w MySQL&#8217;u wydaje się być proste. No bo jaka może być filozofia w odejmowaniu jednej liczby od drugiej, zwłaszcza że obie są typu INT? Jeden przypadek sprawił, że jednak wcale nie jest tak do końca oczywiste.</p>
<p>Załóżmy, że mamy w bazie dwie tabelki X i Y:</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
CREATE TABLE X (
id_y INT(10) UNSIGNED NOT NULL,
amount INT(10) UNSIGNED NOT NULL
);
CREATE TABLE Y (
id_y INT(10) UNSIGNED NOT NULL,
stock INT(10) SIGNED NOT NULL
);
</textarea>
<p>Chcielibyśmy w jednym zapytaniu zmniejszać kolumnę &#8220;stock&#8221; z tabeli Y o wartość &#8220;amount&#8221; z tabeli X. W sumie co to za filozofia? (zakładamy, że stock może być ujemny):</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
UPDATE
Y
SET
stock = stock - (
SELECT
amount
FROM
X
WHERE
X.id_y = Y.id_y
)
</textarea>
<p>Zapytanie działa, cieszymy się, ale co w przypadku kiedy &#8220;amount&#8221; jest większy od &#8220;stock&#8221;? Okazuje się, że MySQL zamiast zapisać wartość ujemną do pola, które zdefiniowaliśmy jako SIGNED, przekręca licznik i wstawia nam 7-cyfrową wartość dodatnią! Powodem tej sytuacji jest bit znakowy, wykorzystywany w polach typu SIGNED i jego brak w polu typu UNSIGNED. Aby zapytanie działało dokładnie tak jakbyśmy tego chcieli, musimy użyć funkcji CAST i wtedy będziemy operować na dwóch identycznych typach.</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
UPDATE
Y
SET
stock = stock - (
SELECT
CAST(amount AS SIGNED)
FROM
X
WHERE
X.id_y = Y.id_y
)
</textarea>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2010/01/26/signed-vs-unsigned-w-mysql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL - niby do przewidzenia, a jednak może zaskoczyć&#8230;</title>
		<link>http://blog.desmart.com/2010/01/26/mysql-niby-do-przewidzenia-a-jednak-moze-zaskoczyc/</link>
		<comments>http://blog.desmart.com/2010/01/26/mysql-niby-do-przewidzenia-a-jednak-moze-zaskoczyc/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 10:24:40 +0000</pubDate>
		<dc:creator>buka</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=109</guid>
		<description><![CDATA[Ot taka ciekawostka, której można się nie spodziewać, a jednak jak już się na to trafi, to wszystko wydaje się oczywiste :)
Ostatnio w jednym z naszych projektów potrzebowałem wyciągnąć z bazy produktów po jednym produkcie według item_code. Miałem listę tych kodów do wyciągnięcia, powiedzmy że obejmowały zakres od 1809 do 1820. Banał.

SELECT * FROM items [...]]]></description>
			<content:encoded><![CDATA[<p>Ot taka ciekawostka, której można się nie spodziewać, a jednak jak już się na to trafi, to wszystko wydaje się oczywiste :)</p>
<p>Ostatnio w jednym z naszych projektów potrzebowałem wyciągnąć z bazy produktów po jednym produkcie według item_code. Miałem listę tych kodów do wyciągnięcia, powiedzmy że obejmowały zakres od 1809 do 1820. Banał.<br />
<code><br />
SELECT * FROM items WHERE item_code = 1809;<br />
</code></p>
<p>I niespodzianka - 3 wyniki, ich item_code&#8217;y to 1809, 1809CI, 1809S. Oczywiście wywaliło to od razu skrypt, bo zamiast tablicy asocjacyjnej z kolumnami dla jednego wiersza, dostałem tablicę 3-elementową, po jednym elemencie dla każdego wiersza.</p>
<p>Krótkie wytłumaczenie, jeżeli jeszcze się ktoś nie domyślił - akurat ta baza jest na tyle durna, że item_code to pole varchar a nie int. Więc jeżeli w warunku jest <strong>item_code = 1809</strong> a nie <strong>item_code = &#8216;1809&#8242;</strong>, to MySQL rzutuje całą kolumnę na integery, przez co do porównania wywala litery z końca kodu i nagle pasują mu aż 3 wpisy. Podanie szukanego kodu w uszach jako stringu daje spodziewany jeden jedyny rekord z kodem 1809.</p>
<p>Więc tylko ku przestrodze - nie wyszukujcie integerów w kolumnach tekstowych!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2010/01/26/mysql-niby-do-przewidzenia-a-jednak-moze-zaskoczyc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL, formatowanie dat i różne języki</title>
		<link>http://blog.desmart.com/2009/11/30/mysql-formatowanie-dat-i-rozne-jezyki/</link>
		<comments>http://blog.desmart.com/2009/11/30/mysql-formatowanie-dat-i-rozne-jezyki/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 12:10:26 +0000</pubDate>
		<dc:creator>buka</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[data]]></category>

		<category><![CDATA[format]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=102</guid>
		<description><![CDATA[Czasem nam się zdarza, że format daty na stronkach ma być bardziej poetycki niż YYYY-mm-dd.
Niby nie ma problemu, słowne formaty też przecież są dostępne. Ale co jeśli serwis jest wielojęzykowy, albo po prostu nie-angielski? Okazuje się że ludziki od MySQLa to przewidzieli i wszystko mamy podane na tacy :)
Wystarczy przestawić locales jednym zapytaniem i już [...]]]></description>
			<content:encoded><![CDATA[<p>Czasem nam się zdarza, że format daty na stronkach ma być bardziej poetycki niż YYYY-mm-dd.</p>
<p>Niby nie ma problemu, słowne formaty też przecież są dostępne. Ale co jeśli serwis jest wielojęzykowy, albo po prostu nie-angielski? Okazuje się że ludziki od MySQLa to przewidzieli i wszystko mamy podane na tacy :)<br />
Wystarczy przestawić <em>locales</em> jednym zapytaniem i już mamy ładne opisowe daty wedle uznania, np dla norweskiego:<br />
<strong>SET lc_time_names = &#8216;no_NO&#8217;;</strong></p>
<p>Od tej pory <strong>SELECT DATE_FORMAT(NOW(), &#8216;%d. %M %Y&#8217;) AS date</strong> daje nam przyjemne dla oka (grafika, nie programisty) <em>&#8216;23. oktober 2009</em>&#8216;. No, trochę lewy przykład, bo Norwegowie mają prawie identyczne nazwy miesięcy jak Angole, no ale przynajmniej już jest przez &#8216;k&#8217; ;)</p>
<p>Więcej do poczytania i dostępne wartości <em>lc_time_names</em> są tutaj:<br />
<a  href="http://dev.mysql.com/doc/refman/5.0/en/locale-support.html" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/dev.mysql.com/doc/refman/5.0/en/locale-support.html');" >http://dev.mysql.com/doc/refman/5.0/en/locale-support.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/11/30/mysql-formatowanie-dat-i-rozne-jezyki/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IE 6 = IE 8?</title>
		<link>http://blog.desmart.com/2009/10/05/ie-6-ie-8/</link>
		<comments>http://blog.desmart.com/2009/10/05/ie-6-ie-8/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 13:29:29 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Programy]]></category>

		<category><![CDATA[Przeglądarki]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=97</guid>
		<description><![CDATA[Posiadanie różnych wersji IE na tym samym profilu nie jest zbyt fajnym rozwiązaniem. Przykładowo IE6 potrafi sobie przejąć część zachowań z IE8, lub innymi słowy mówiąc to IE8 wkrada się w silnik IE6 przez co przeglądarka czasami zachowuje się w sposób nieobliczalny.
Przykładowo: chcę dołączyć (w
komentarzu warunkowym) arkusz styli przeznaczony tylko i wyłącznie dla IE6 (lub [...]]]></description>
			<content:encoded><![CDATA[<p>Posiadanie różnych wersji IE na tym samym profilu nie jest zbyt fajnym rozwiązaniem. Przykładowo IE6 potrafi sobie przejąć część zachowań z IE8, lub innymi słowy mówiąc to IE8 wkrada się w silnik IE6 przez co przeglądarka czasami zachowuje się w sposób nieobliczalny.</p>
<p>Przykładowo: chcę dołączyć (w<br />
<a  href="http://leksykot.top.hell.pl/notatki/www/ie-hacks.shtml" onclick="javascript:pageTracker._trackPageview('/external/leksykot.top.hell.pl/notatki/www/ie-hacks.shtml');" >komentarzu warunkowym</a>) arkusz styli przeznaczony tylko i wyłącznie dla IE6 (lub niższych). W kodzie wszystko jest poprawnie zapisane, a moje IE jakimś cudem nie łapie zmian. Okazało się, że musiałem zmodyfikować komentarz warunkowy na:</p>
<textarea name="code" class="html:nogutter" cols="60" rows="10">
&lt;!--[if lte IE 8]&gt;&lt;link rel="stylesheet" type="text/css" href="css/ie6.css" /&gt;&lt;![endif]--&gt;
</textarea>
<p>Po tym triku nasz arkusz zostaje załączony. Wychodzi na to, że IE6 renderuje całość wg swoich kryteriów, natomiast identyfikuje się jako IE8. Sprawa trochę kłopotliwa gdyż wprowadza trochę problemów podczas pisania kodu. Można to obejść, lecz trzeba pilnować aby przed wystawieniem na produkcję poprawić ten komentarz warunkowy.</p>
<p>Zamiast instalować kolejne wersje IE można skorzystać z aplikacji<br />
<a  href="http://my-debugbar.com/wiki/IETester/HomePage" onclick="javascript:pageTracker._trackPageview('/external/my-debugbar.com/wiki/IETester/HomePage');" >IETester</a>. Program oferuje odpalenie dowolnej strony przy pomocy jednej z wersji IE. Razem z nim jest zainstalowany Debug Toolbar, który potrafi być bardzo przydatny. Wadą tego programu jest to, że czasami potrafi w zadziwiający sposób wyświetlać niektóre strony przez co ciężko jest poprawiać jakiekolwiek błędy.</p>
<p>Myślę, że to najwyższa pora przyłączyć się do frontu likwidacji IE6 =)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/10/05/ie-6-ie-8/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pyczuś pracuje :))</title>
		<link>http://blog.desmart.com/2009/10/01/pyczus-pracuje/</link>
		<comments>http://blog.desmart.com/2009/10/01/pyczus-pracuje/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 14:09:50 +0000</pubDate>
		<dc:creator>birkin</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=92</guid>
		<description><![CDATA[Nakład pracy spowodował, że nieboraczka Natalia wpadła w sidła szaleństwa. Jedynie pies-egzorcysta może jej pomóc!
Pyczuś!
]]></description>
			<content:encoded><![CDATA[<p>Nakład pracy spowodował, że nieboraczka Natalia wpadła w sidła szaleństwa. Jedynie pies-egzorcysta może jej pomóc!</p>
<p><a  href="http://www.youtube.com/watch?v=DW5UOoFh-Tc" onclick="javascript:pageTracker._trackPageview('/external/www.youtube.com/watch');" >Pyczuś!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/10/01/pyczus-pracuje/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Duży INSERT i zduplikowane klucze</title>
		<link>http://blog.desmart.com/2009/09/01/duzy-insert-i-zduplikowane-klucze/</link>
		<comments>http://blog.desmart.com/2009/09/01/duzy-insert-i-zduplikowane-klucze/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:38:47 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=89</guid>
		<description><![CDATA[Mam przykładowo tablę, która pełni rolę licznika odwiedzin dla danego rekordu. Aby troszkę to utrudnić to ta tabela dodatkowo przetrzymuje informacje jakiego typu jest ten licznik. Oczywiście został ustawiony unikalny klucz typu id-typ. Taki licznik można inkrementować jednym zapytaniem:

INSERT INTO licznik SET id = 1, typ = 'strona_glowna', licznik = 1 ON DUPLICATE KEY UPDATE [...]]]></description>
			<content:encoded><![CDATA[<p>Mam przykładowo tablę, która pełni rolę licznika odwiedzin dla danego rekordu. Aby troszkę to utrudnić to ta tabela dodatkowo przetrzymuje informacje jakiego typu jest ten licznik. Oczywiście został ustawiony unikalny klucz typu <em>id-typ</em>. Taki licznik można inkrementować jednym zapytaniem:</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
INSERT INTO licznik SET id = 1, typ = 'strona_glowna', licznik = 1 ON DUPLICATE KEY UPDATE licznik = licznik + 1;
</textarea>
<p>Zapytanie jest raczej proste (jeśli nie wiesz co oznacza &#8220;ON DUPLICATE KEY&#8221;<br />
<a  href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html" onclick="javascript:pageTracker._trackPageview('/external/dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html');" >odsyłam</a> do manuala MySQL). Całość trochę się komplikuje kiedy jednym SQLem chcę wrzucić kilkanaście rekordów. W tej sytuacji nasze zapytanie zmienia formę na coś takiego:</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
INSERT INTO
licznik (id, typ, licznik)
VALUES
(1, 'strona_glowna', 1), (1, 'produkt', 1), (2, 'strona_glowna', 1), (...)
ON DUPLICATE KEY UPDATE licznik = licznik + VALUES(licznik)
</textarea>
<p>Wpis ku pamięci.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/09/01/duzy-insert-i-zduplikowane-klucze/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Uważaj na include i include_once!</title>
		<link>http://blog.desmart.com/2009/08/14/uwazaj-na-include-i-include_once/</link>
		<comments>http://blog.desmart.com/2009/08/14/uwazaj-na-include-i-include_once/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 12:55:17 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=86</guid>
		<description><![CDATA[Funkcja include() przydaje się w wielu sytuacjach. Jest też parę sztuczek i kruczków z tym związanych (o których mowa w manualu PHP).
Mój skrypt dzielił się na kilka akcji, odpalanych w jednej instancji po kolei. Pierwsza akcja wrzucała parę rekordów do bazy, a potem zapisywała ich ID do tablicy. Ta tablica natomiast była eksportowana do pliku [...]]]></description>
			<content:encoded><![CDATA[<p>Funkcja include() przydaje się w wielu sytuacjach. Jest też parę sztuczek i kruczków z tym związanych (o których mowa w manualu PHP).</p>
<p>Mój skrypt dzielił się na kilka akcji, odpalanych w jednej instancji po kolei. Pierwsza akcja wrzucała parę rekordów do bazy, a potem zapisywała ich ID do tablicy. Ta tablica natomiast była eksportowana do pliku w formacie:</p>
<textarea name="code" class="php:nogutter" cols="60" rows="10">
&lt;?php return array('foo', 'bar', 'baz'); ?&gt;
</textarea>
<p>Kolejna akcja wczytywała tą tablicę (za pomocą polecenia $arr = include(&#8217;data.php&#8217;);), dokonywała na niej modyfikacji i ponownie zapisywała w podobny sposób, do tego samego pliku.</p>
<p>Po uprzednim przygotowaniu danych (przez akcje <em>I</em> i <em>II</em>), akcja <em>III</em> ponownie ładowała ten plik. Tutaj niestety był błąd, bo użyłem include_once() zamiast include(). Efekt tego był taki, że include_once() nie zwrócił tej tablicy, a jedynie przekazał wartość logiczną TRUE.</p>
<p>Sprawiło mi to niemały problem, ponieważ akcja <em>III</em> się wysypała, z powodu złych danych w zmiennej, a debugowanie było dość uciążliwe (ciężko było znaleźć błąd). Oczywiście łatwo domyślić się dlaczego tak się stalo. Z tego też powodu uczulam na użycie funkcji include_once w kontekście zwracania zmiennych. Zamiast tego należy użyć include().</p>
<p>Jak wspomniałem, takie zachowanie wynika ze specyfikacji działania funckji include_once(). Wpis ku pamięci.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/08/14/uwazaj-na-include-i-include_once/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Wielowymiarowe tablice a POST via CURL</title>
		<link>http://blog.desmart.com/2009/07/29/wielowymiarowe-tablice-a-post-via-curl/</link>
		<comments>http://blog.desmart.com/2009/07/29/wielowymiarowe-tablice-a-post-via-curl/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 09:58:09 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=84</guid>
		<description><![CDATA[Dzisiaj odbyliśmy małą walkę z wysłaniem metodą POST tablicy wielowymiarowej. Problemem było to, że CURL konwertował tablicę typu:

array(
'foo' =&#62; 'bar',
'bah' =&#62; array(
1 =&#62; 'sth',
),
);

do:

array(
'foo' =&#62; 'bar',
'bah' =&#62; 'Array',
);

Najwyraźniej PHPowy CURL spłaszcza takie tablice, robiąc straszne zamieszanie :) Rozwiązanie jest dość banalne. Trzeba &#8220;ręcznie&#8221; spłaszczyć taką tablicę do formatu:

array(
'foo' =&#62; 'bar',
'bah[1]' =&#62; 'sth',
);

W ten sposób odebrane [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj odbyliśmy małą walkę z wysłaniem metodą POST tablicy wielowymiarowej. Problemem było to, że CURL konwertował tablicę typu:</p>
<textarea name="code" class="php:nogutter" cols="60" rows="10">
array(
'foo' =&gt; 'bar',
'bah' =&gt; array(
1 =&gt; 'sth',
),
);
</textarea>
<p>do:</p>
<textarea name="code" class="php:nogutter" cols="60" rows="10">
array(
'foo' =&gt; 'bar',
'bah' =&gt; 'Array',
);
</textarea>
<p>Najwyraźniej PHPowy CURL spłaszcza takie tablice, robiąc straszne zamieszanie :) Rozwiązanie jest dość banalne. Trzeba &#8220;ręcznie&#8221; spłaszczyć taką tablicę do formatu:</p>
<textarea name="code" class="php:nogutter" cols="60" rows="10">
array(
'foo' =&gt; 'bar',
'bah[1]' =&gt; 'sth',
);
</textarea>
<p>W ten sposób odebrane dane będą identyczne z tymi co wysłano.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/07/29/wielowymiarowe-tablice-a-post-via-curl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[MySQL] Grupowanie i sortowanie wyników</title>
		<link>http://blog.desmart.com/2009/07/03/mysql-grupowanie-i-sortowanie-wynikow/</link>
		<comments>http://blog.desmart.com/2009/07/03/mysql-grupowanie-i-sortowanie-wynikow/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 08:07:52 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=82</guid>
		<description><![CDATA[Swego czasu miałem spory problem z rozwiązaniem problemu wyciągnięcia danych grupując i sortując jednocześnie.
Cały problem polegał na tym, że chciałem wyciągnąć najnowszego newsa z konkretnej grupy. Robiłem to mniej więcej tak:

SELECT
*
FROM
news
GROUP BY group_id
ORDER BY date_publication DESC

Niestety wynik bywał opłakany, bo wyciągane były zazwyczaj newsy pierwsze z brzegu. Dlaczego? Otóż przed ORDERem następuje grupowanie. MySQL w [...]]]></description>
			<content:encoded><![CDATA[<p>Swego czasu miałem spory problem z rozwiązaniem problemu wyciągnięcia danych grupując i sortując jednocześnie.</p>
<p>Cały problem polegał na tym, że chciałem wyciągnąć najnowszego newsa z konkretnej grupy. Robiłem to mniej więcej tak:</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
SELECT
*
FROM
news
GROUP BY group_id
ORDER BY date_publication DESC
</textarea>
<p>Niestety wynik bywał opłakany, bo wyciągane były zazwyczaj newsy pierwsze z brzegu. Dlaczego? Otóż przed ORDERem następuje grupowanie. MySQL w tej sytuacji nie patrzy na to czy ma jakoś posortować dane, tylko najpierw grupuje, a potem coś tam próbuje posortować :)</p>
<p>Żeby rozwiązać ten palący problem spędziłem trochę czasu na poszukiwaniach w Sieci. Widziałem jakieś INNER JOINy z JOINami i innymi cudami. Rozwiązanie, które pokażę (a znalazłem przypadkiem :)) wykorzystuje podzapytanie. Całość wydaje się zgrabna i czytelna, chociaż przyznam, że nie sprawdzałem pod kątem wydajności.</p>
<textarea name="code" class="sql:nogutter" cols="60" rows="10">
SELECT
*
FROM
(
SELECT * FROM news ORDER BY date_publication DESC
)
GROUP BY group_id
</textarea>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/07/03/mysql-grupowanie-i-sortowanie-wynikow/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chwała tablicom! Czyli o tym jak można przyspieszyć rzeczy :)</title>
		<link>http://blog.desmart.com/2009/03/19/chwala-tablicom-czyli-o-tym-jak-mozna-przyspieszyc-rzeczy/</link>
		<comments>http://blog.desmart.com/2009/03/19/chwala-tablicom-czyli-o-tym-jak-mozna-przyspieszyc-rzeczy/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 07:50:21 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://blog.desmart.com/?p=78</guid>
		<description><![CDATA[Miałem za zadanie zrobić import jakiś danych o uzytkownikach z pliku tekstowego. Użytkowników w bazie już miałem (jakieś 50k rekordów), import miał za zadanie uzupełnić ich dane.
Parsowanie pliku było dość banalne. Poboierałem z niego dane (login i reszta danych), później pobierałem z bazy id usera (po loginie) i robiłem resztę rzeczy. Wszystko było super, aż [...]]]></description>
			<content:encoded><![CDATA[<p>Miałem za zadanie zrobić import jakiś danych o uzytkownikach z pliku tekstowego. Użytkowników w bazie już miałem (jakieś 50k rekordów), import miał za zadanie uzupełnić ich dane.</p>
<p>Parsowanie pliku było dość banalne. Poboierałem z niego dane (login i reszta danych), później pobierałem z bazy id usera (po loginie) i robiłem resztę rzeczy. Wszystko było super, aż do momentu odpalenia. Plik z danymi był spory, ale po pół godziny pracy import nadal się nie zakończył!</p>
<p>Zastanawiałem się jak to przyspieszyć. Przypomniała mi się rzecz, o której tyle razy przypominał Dooshek - użycie tablic. Na czym polega cały myk? Otóż na początku pobierałem wszystkie loginy i id userów i zapisywałem do tablicy w formacie [login] =&gt; [uid]. Podczas importu danych z pliku sprawdzałem id usera z tablicy przez co pół godzinny import wykonał się nagle w 30sek. :)</p>
<p>Warto o tym szczególe pamiętać. Ja już któryś raz z rzędu o tym zapomniałem, a szkoda. Straciłem trochę czasu na optymalizację mojego importu.</p>
<p>Przy zawrotnej liczbie rekordów pewnie nie będzie warto robić takiej tablicy (ponieważ zje zasoby :) ), ale przy jakiejś mniejszej liczbie myślę, że warto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.desmart.com/2009/03/19/chwala-tablicom-czyli-o-tym-jak-mozna-przyspieszyc-rzeczy/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
