Phing

12 lutego 2011

Istnieje dowcip, że komputer to narzędzie dzięki któremu rozwiązujemy problemy, które bez niego by nie istniały. Coś w tym jest. Mimo to komputery w dużej części służą do robienia różnych rzeczy szybciej, dokładniej, jednym słowem lepiej. Co dziwne, sami programiści czasami o tym zapominają i robią mnóstwo rzeczy „na piechotę” zamiast wyręczyć się maszyną.

Im bardziej skomplikowany jest projekt nad którym pracujemy tym bardziej złożony jest proces od tworzenia po wdrożenie kodu. Wgrywanie plików na kolejne serwery (produkcyjny, testowy etc.), pilnowanie spójności bazy danych, zarządzanie repozytorium, generowanie dokumentacji, wersjonowanie itd. To wszystko zabiera naprawdę mnóstwo czasu.

Czy można to jakoś zautomatyzować?
Oczywiście, że można i są do tego narzędzia, chociażby make. Pojawiają się jednak przeszkody.
Po pierwsze, są problemy z przenośnością między różnymi systemami. Najczęściej dane rozwiązanie działa tylko na jednej rodzinie systemów.
Po drugie, narzędzia te nie są łatwe (dla windowsowca make to naprawdę orka). Oczywiście ich nauka to samo dobro, przyda nam się na przyszłość ale czasami są ważniejsze rzeczy do poznania a i czas nie jest tu bez znaczenia.
Po trzecie wreszcie, przydałoby się nam narzędzie pomyślane i zaprojektowane stricte pod PHP. Najlepiej napisane w samym PHP bo po co nam kolejne technologie…

Panaceum na nasze bolączki okazuje się Phing.

Nie jest on nowym projektem. Nie mogłem doszukać się konkretnej daty jego startu ale wszystkie znaki na niebie i ziemi wskazują, że zaczęło się już w 2002 roku. Mimo upływu tylu lat, w Polsce (trudno mi oceniać jak jest w innych krajach) projekt nie jest chyba zbyt popularny. Takie jest przynajmniej moje wrażenie bo google nie zwraca zbyt wielu sensownych wyników na zapytanie „Phing” dla naszego języka, nie widywałem również dyskusji na forach/grupach dyskusyjnych o tym narzędziu a już zupełnie nikt o nim nie wspomina w CV lub ogłoszeniach o pracę. Błąd.

Sam zainteresowałem się Phingiem jakiś czas temu, co oznacza, że było to kiedyś ale nie pamiętam dokładnie kiedy :) Niestety, tylko na niego zerknąłem, stwierdziłem, że mi to nie jest potrzebne i zapomniałem. Faktycznie, wtedy nie było mi potrzebne ale z perspektywy czasu wiem, że rok, półtora roku temu Phing mógłby znacznie ułatwić mi życie.

Phing’a bardzo ładnie opisał zyxist w artykule Phing – system budowania dla PHP (proponuję zacząć naukę Phinga właśnie od tego artykułu) więc nie będę powielał tych informacji. Dla zachęty pozwolę sobie jedynie zacytować listę możliwości:

  • kopiowanie plików, katalogów,
  • tworzenie archiwów GZIP, BZIP2, ZIP,
  • tworzenie archiwów PHAR,
  • tworzenie pakietów PEAR i PEAR2,
  • zarządzanie numerami wersji,
  • wysyłanie plików na serwer FTP,
  • wysyłanie żądań HTTP, autoryzacja HTTP,
  • wysyłanie e-maili,
  • generowanie raportów pokrycia kodu testami (PHPUnit),
  • wykonywanie testów jednostkowych (PHPUnit),
  • generowanie dokumentacji API (PHPDocumentor),
  • obsługa systemów kontroli wersji: CVS, SVN, Git,
  • instalacja baz danych,
  • obsługa SCP i SSH,
  • wsparcie dla różnych narzędzi takich, jak PHP_CodeSniffer.

Lista ta jest niepełna, a wraz z rozwojem projektu liczba dostępnych typów zadań jest coraz większa.

Dodam od siebie jedynie tyle, że gdyby jednak czegoś Wam na tej liście brakowało to Phing’a można w łatwy sposób rozbudowywać pisząc specjalne rozszerzenia. Odsyłam do dokumentacji. Właśnie, dokumentacja całego projektu jest przyjemna, wszystko ładnie opisane, nikt nie powinien mieć problemów ze zrozumieniem.

Gdyby ktoś chciał poznać inne narzędzia tego typu to polecam zacząć od komentarzy do wcześniej podlinkowanego artykułu z zyxist.com. Warto przejrzeć również linki zamieszczone na końcu tekstu Automatyczne publikowanie aplikacji PHP autorstwa Jakuba Zalasa.


Nowe php.net

10 lutego 2011

Oficjalna witryna PHP raczej nie zachęca potencjalnych nowych programistów tego języka do zapoznania się z jego możliwościami. Strona wizualnie nie zmieniła się prawie wcale od roku 2001. Dziesięć lat!

Nowa wersja jest jeszcze w fazie Alpha i nie należy się po niej zbyt wiele spodziewać… Mimo to, cieszy, że w ogóle dostrzegli problem.

Zmiany można oglądać po odwiedzeniu tego linka: www.php.net/?beta=1. Nie wiem co już jest gotowe a co będzie jeszcze dodawane/poprawiane ale na razie wygląda na to, że jedynie górne menu jest jako tako dopracowane. Na resztę trzeba czekać.

Kod strony jest teraz lepiej przygotowany. Nastawili się na HTML5, wykorzystują nowe tagi. Zanosi się również na szersze wykorzystanie jQuery.

Do starej wersji php.net można w każdej chwili wrócić klikając na ten link: www.php.net/?beta=0.


Chcesz płacić mniejsze rachunki? Przeczytaj

28 stycznia 2011

Internet i TV mam miałem z pewnej sieci kablowej. Wepchnęli mi jeszcze telewizję cyfrową, taka „promocja” wtedy była. Miesięczny rachunek to było około 120zł i przyznam, że zaczęło mnie to z czasem uwierać tu i ówdzie…

Nasycenie rynku jest duże. Uzbrojony w tą wiedzę postanowiłem zrezygnować ze wszystkich usług jakie do tej pory świadczyła dla mnie kablówka. Przeczuwałem efekt :)

Z rezygnacją w ręku (wzór) udałem się do BOK. Jako powód podałem zbyt duże opłaty. To był bodajże piątek. W poniedziałek zadzwonił telefon. Zaproponowano mi upust. Z ponad 60zł za TV plus chyba 10zł za TV cyfrową rachunek zmalał do 40zł. Z Internetu zrezygnowałem, wziąłem od innego operatora.

Gdy kończy Ci się umowa (lub robią jakieś zmiany w cenniku, regulaminie itp. tak jak to jest właśnie teraz w mojej sieci kablowej) możesz złożyć wniosek o rozwiązanie umowy. Nic nie ryzykujesz! Jeżeli Twój dostawca nie będzie chciał dać Ci rabatu to w każdej chwili możesz zrezygnować z rezygnacji :P Opisałem przygodę z telewizją ale można znaleźć inne podobne przypadki np. umowa z dostawcą telefonii komórkowej. Próbuj!

Tutaj jest mój wzór wypowiedzenia umowy o świadczenie usług. Łatwo go dostosować do własnych potrzeb.


Porządek na pulpicie

21 stycznia 2011

Skoro był wpis o zmianie kolejności ikon okien na pasku zadań to wypada iść za ciosem. Pulpit to miejsce najszybciej dostępne w komputerze. Z tego powodu mam na nim permanentny bałagan :) Trafiają tam wstępnie wszystkie pliki ściągane z sieci i inne elementy, które chce mieć pod ręką. Niestety, mimo moich najszczerszych chęci, nie wychodzi mi utrzymanie tam porządku. Przez lata miałem tak dużo ikon, że nagminnie mi się nie mieściły i do ostatnich plików dostawałem się operując strzałkami na klawiaturze i otwierałem z pamięci naciskając Enter :D Tymczasowe rozwiązania polegały na utworzeniu katalogu o nazwie Pulpit X (gdzie X to kolejny numerek) i przenoszeniu połowy plików do niego :) Aż nadchodził ten chwalebny czas gdy zabierałem się za porządki. Po dwóch tygodniach bałagan wracał :)

Jest jednak sposób aby na pulpit wprowadzić jako taki porządek. Co prawda nadal sami musimy ograniczać ilość plików i katalogów ale czemu by ich jakoś sensownie nie pogrupować? Z pomocą przychodzi Fences. Ten mały programik pozwala tworzyć na pulpicie wydzielone i podpisane obszary. Najłatwiej zaprezentować to na nagraniu:

Program jest darmowy, istnieje również płatna wersja (20$) z dodatkowymi funkcjonalnościami.


Ustawianie kolejności przycisków na pasku zadań

26 grudnia 2010

W systemach z rodziny Windows zawsze brakowało mi jednej, prostej funkcjonalności. Czemu system nie ma wbudowanej możliwości zmiany kolejności ikon okien na pasku zadań (tzw. pasek Start)?! Jak to możliwe, że przez tyle lat programiści Microsoft nie dodali tak banalnej funkcji?!

Niektórzy być może nie widzą problemu. Ja mam jednak bardzo często otworzonych jednocześnie wiele programów, wiele okien (z tego powodu pasek mam zawsze podniesiony o jeden poziom wyżej od standardowego). Przy kilkunastu przyciskach na pasku, brak możliwości ułożenia ich w takiej kolejności jak mi się podoba jest naprawdę uciążliwy.

Rozwiązaniem moich (i pewnie nie tylko moich) bolączek jest program Taskix. Nie ma tu o czym pisać, on po prostu działa ;) Wystarczy zastosować metodę przeciągnij-upuść. Ma też kilka dodatkowych funkcji, dowiecie się o nich z oficjalnej strony (adres wcześniej).

Alternatywą (nie testowałem, w przeciwieństwie do Taskix, który działa u mnie dobre 8 miesięcy) jest Taskbar Shuffle. Darmowy, również z kilkoma dodatkowymi funkcjami.

Bardziej rozbudowany jest xNeat Windows Manager. Tu funkcja, która jest głównym tematem tego wpisu to tylko jedno z kilku ciekawych ulepszeń systemu. Osobiście jednak nie instalowałem bo doszedłem do wniosku, że mimo wszystko nie będę korzystał z dodatkowych funkcjonalności i lepiej zainstalować coś malutkiego i lekkiego.

I to już koniec. Pewnie są jeszcze inne programy, które udostępniają tytułową funkcję ale trzy powyższe powinny zadowolić każdego. Jestem pewien, że nie tylko mi brakowało takiego rozwiązania ;)

PS
Trochę spóźnione ale Wszystkiego Najlepszego! I przy okazji… Nie wiem jaki dla Was był ten rok ale życzę Wam, żeby 2011 był lepszy :)


Wyciąganie adresów filmów z YouTube zamieszczonych w tekście

15 grudnia 2010

Temat YouTube przypadkowo pojawia się na moim blogu drugi raz w krótkim czasie. Nie wiedziałem jaki tytuł nadać temu newsowi, najlepiej będzie gdy na przykładzie wytłumaczę w czym dzisiaj chciałbym Wam pomóc :)

Na nasztomaszow.pl w treści artykułów można oczywiście wpisywać kod HTML. Co za tym idzie, nie ma problemu ze wstawianiem filmików z YouTube. Problem z takim rozwiązaniem jest wtedy gdy chcielibyśmy móc jakoś zarządzać tymi filmami, zrobić ich katalog etc. Nie ma się czego uczepić bo filmy nie są zapisane w bazie w jakiś uporządkowany sposób.

Można byłoby utworzyć katalog filmów a potem wymyślić jakieś znaczniki np. BBCode i za ich pomocą umieszczać filmy w treści artykułów. To byłoby jednak kłopotliwe. Najprościej wejść na stronę filmu, skopiować kod HTML i zapomnieć o całej sprawie.

Nie pozostaje nam nic innego jak przetworzyć tekst i wyciągnąć z HTML'a potrzebne adresy. Oto gotowe rozwiązanie:

PHP:
  1. preg_match_all('@youtube\.(?:com|pl)/(?:watch\?v=|v/){1}([^&?#/"<]+)@si', $body, $youtube);
  2.  
  3. if(isset($youtube[1]) AND is_array($youtube[1]) AND !empty($youtube[1])) {
  4.  
  5.   $youtube = array_unique($youtube[1]);
  6.  
  7.   // wsadzamy informacje do bazy danych
  8. }

W zmiennej $body jest tekst gdzie może znajdować się także kod HTML jakiegoś filmu z YouTube (lub filmów, może ich być wiele ale może nie być żadnego). Wyrażenie wyciąga identyfikatory filmów, ostatecznie pojawiają się one w tablicy $youtube. Wcześniej upewniamy się jeszcze, że filmy się nie zdublują.

Powyższy kod wyciąga adresy filmów zarówno z HTML, który odpowiada za umieszczenie odtwarzacza na stronie jak i ze zwykłych odnośników do strony youtube.com.

W ten prosty sposób mamy informacje o wszystkich filmach w danym tekście. Identyfikatory możemy zapisać do bazy danych i robić z nimi co nam się podoba.

Konkretny przykład. W poprzednim newsie dodałem swój wywiad na temat osady. Adres tego filmu to http://www.youtube.com/watch?v=CGzTCNn5Zos. W takim razie identyfikator filmu to CGzTCNn5Zos. Ta informacja wystarczy nam aby wygenerować gdzie indziej link do tego filmu, kod HTML odtwarzacza czy wstawić screen z filmiku.

Generowanie linku lub kodu odtwarzacza to pikuś. Skupmy się na screenach. Mają one swoje konkretne adresy w postaci http://img.youtube.com/vi/IDENTYFIKATOR/X.jpg gdzie:
IDENTYFIKATOR - Tego chyba nie trzeba tłumaczyć.
X - Cyfra od 0 do 3. 0 to duży, główny screen a 1, 2 i 3 to trzy małe klatki wyciągnięte z filmu.

Przykład:

http://img.youtube.com/vi/CGzTCNn5Zos/0.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/1.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/2.jpg
http://img.youtube.com/vi/CGzTCNn5Zos/3.jpg

osada.pl: wspomnień czar

10 grudnia 2010

Kolejny raz łamię swoje postanowienie, że "to już ostatni news o osada.pl" :) Mam jednak sentyment do tego portalu...

Kilka dni temu robiłem porządki z płytami, które już od dłuższego czasu leżały i zbierały kurz. Jedna z nich podpisana była "osada". Po włożeniu jej do napędu natychmiast wróciły wspomnienia ;)

Niedługo po tym jak w eter poszedł mój wywiad w iTV o osada.pl postanowiono iść za ciosem i nagrać drugi mini wywiad. Pojechałem, posadzili mnie na krześle obok jakiegoś monitora i kazali gadać do kamery. A za kamerą kilka twarzy usilnie próbujących mnie rozśmieszyć :) Wszyscy poszli na żywioł, nie znałem wcześniej pytań więc odpowiedzi nie były mocno przemyślane... Widać to szczególnie we fragmencie gdzie mówię o przyszłości strony. Trudno :)

Dla mnie odnalezienie tego wywiadu to wielka niespodzianka. Dostałem go na DVD ale podczas próby odtworzenia nie chciał działać i pogodziłem się wtedy, że go nie zobaczę. Na szczęście teraz okazuje się, że to musiały być jakieś problemy ze sprzętem/oprogramowaniem. Ostatni wtorek był tym miłym dniem gdy zobaczyłem to nagranie pierwszy raz. Po prawie czterech latach.

Mała uwaga. Nigdy, przenigdy nie odmieniajcie (poza mową potoczną oczywiście) nazw serwisów w stylu: osady.pl, fotki.pl, onecie.pl itd. Ktoś potem będzie próbował wejść na taki adres...

PS
Przy okazji tematu o osada.pl warto wspomnieć o ciekawym fakcie. Kiedyś natrafiłem na tą stronę gdzie ludzie z sympatia.pl chwalą się swoimi statystykami. Mnie jednak najbardziej zainteresowało dziewiąte miejsce w tabelce :)

Dane pochodzą z lipca 2006 a więc na pół roku przed szczytem popularności osada.pl. Liczby zaprezentowane w tym zestawieniu są trochę zaniżone ale nie ma pewności czy w przypadku innych serwisów nie było tak samo. Może w rzeczywistości osada.pl była trochę wyżej, to możliwe. Ciekaw jestem jak to wyglądało w grudniu 2006, wtedy osada biła rekordy popularności. Unikalnych użytkowników było chyba ponad 400 tysięcy a odsłon ponad 11 milionów.

Podsumowując: osada była w czołówce portali randkowych. Fajnie! :)


Congratulations! Your account is now enabled for uploads longer than 15 minutes. Click the Upload button below to select a video.

10 grudnia 2010

Tytuł tego wpisu to dokładny cytat komunikatu jakim mnie dzisiaj przywitał youtube.com. Nareszcie chłopaki!

Kiedyś na YouTube można było wrzucać długie filmy. Chyba do godziny, chociaż nie pamiętam dokładnie. Szybko okazało się, że nie wyrabiają się technicznie i od tamtego czasu mieliśmy limit 10 minut (podobno jak ktoś zarejestrował się wcześniej to został mu ten większy limit, godzinny). Niedawno wszystkim podarowano 5 minut więcej. Natomiast wczoraj pojawił się zaskakujący news. Otóż wybranym użytkownikom, którzy byli do tej pory grzeczni (nie łamali praw autorskich itd.), zniesiono limit 15 minut. Jaki jest nowy limit? Zacytuję:

As long as it’s your original content, it’s fair game regardless of length.

Czyżby limitu nie było w ogóle? :)

Mam to szczęście, że na moim prywatnym koncie również zniesiono limit. Pewnie nie będzie zbyt wielu okazji aby to wykorzystać ale dobrze jest wiedzieć, że nic mnie nie ogranicza.

Jeżeli masz konto na YouTube to przejdź do podstrony przesyłania nowego filmu (link "Prześlij film"). Jeżeli jesteś wybrańcem to odpowiedni komunikat pojawi się na górze strony. Powodzenia!

PS
Opisywana historia limitów na YouTube dotyczy oczywiście tylko zwykłych użytkowników. Partnerzy serwisu (duże firmy, znane marki itd.) nie mieli nigdy limitów.


php.js

05 grudnia 2010

Na blogu staram się opublikować coś chociaż raz w miesiącu. Pomysłów na tematy jest więcej tylko czasu brak (wiem, przynudzam już z tym brakiem czasu). Zdarza się tak, że chcę o czymś napisać, tworzę szkic, napiszę klika zdań i... nie kończę, nie publikuję.

Tak było z php.js. Chciałem o tym napisać półtora roku temu! Wspomniałem potem o tej bibliotece we wpisie "Pokochać JavaScript" ale to były zaledwie dwa zdania.

Ostatnimi laty coraz częściej miałem do czynienia z JavaScript, zwłaszcza przez ostatni rok. Początkowo nie byłem z tego powodu jakoś szczególnie radosny ale dzisiaj spokojnie mogę napisać, że darzę JS taką samą sympatią jak PHP. Niestety czasami brakuje mi funkcji dobrze znanych z PHP. Szczególnie w pracy z ciągami znaków.

Nasze kochane PHP zdobyło swoją popularność między innymi dlatego, że posiada wiele wbudowanych funkcji, które rozwiązują za nas szereg często występujących problemów. Rozleniwiony takim komfortem programista (na przykład ja) może czuć się zagubiony i zakłopotany podczas pracy z innymi, mniej przyjaznymi pod tym względem językami (na przykład JavaScript).

Na szczęście kilku zdolnych ludzi powołało do życia zbiór funkcji pod wspólną nazwą php.js. Projekt ten ma na celu przeniesienie popularnych funkcji dostępnych w PHP do JavaScript. Efekt jest imponujący.

Ilość funkcji przeniesionych z PHP sięga 438 (stan na 5 grudnia 2010)! Udostępniono gotowe do ściągnięcia paczki, możemy również sami je tworzyć wybierając tylko te funkcje, które nas interesują. Nic także nie stoi na przeszkodzie aby podejrzeć źródło wybranej funkcji i po prostu przekopiować kod do własnego projektu.

Projekt jest open source, każdy może tam wnieść swoją cenną wiedzę. Z tym jednak coraz ciężej, do oprogramowania zostały już funkcje najbardziej problematyczne w implementacji.

Czerp z tego projektu pełnymi garściami ale nie używaj bezmyślnie całego zbioru funkcji! Nie uwierzę, że pracujesz przy pojedynczym projekcie, który wymaga od Ciebie więcej niż 5% funkcji zawartych w php.js. Przemyśl czego potrzebujesz i zbuduj własny plik lub wklej odpowiednie funkcje do swoich skryptów.

Uwaga
Funkcje z projektu php.js można pobrać w trzech postaciach. Zwykłej, obiektowej (namespaced) i zgodnej z założeniami CommonJS. Jeżeli nie wiesz co wybrać to znaczy, że potrzebujesz postaci domyślnej (zwykłej).


Raport zbiorczy z kilku tabel w MySQL

01 listopada 2010

Dzisiaj kolega zapewnił mi niezłą "rozrywkę" :) Przyszedł z ciekawym zadaniem a ja jestem uparty, zawsze siedzę aż zrobię. Problem był następujący:

  • Mamy dwie tabele w bazie
  • Obie tabele wyglądają tak samo (pola: ID, saldo)
  • Pola ID w obu tabelach dotyczą tego samego obiektu ale w obu tabelach ID te mogą się różnić (np. w jednej są ID 1, 5, 7 a w drugiej 1, 3, 9)
  • Oczekiwany efekt to jedno zapytanie SQL, które zwróci trzy kolumny: ID, saldo z tabeli pierwszej, saldo z tabeli drugiej
  • W raporcie muszą być wszystkie numery ID z obu tabel ale nie mogą się dublować
  • Jeżeli konkretne ID istnieje tylko w jednej tabeli to w kolumnie z saldem z tej tabeli ma się wyświetlić odpowiednia wartość a w drugiej kolumnie (z saldem z drugiej tabeli) ma być 0

Najłatwiej objaśnić wszystko na przykładzie. Zrzut bazy:

SQL:
  1. CREATE TABLE IF NOT EXISTS `a` (
  2.   `id` tinyint(2) UNSIGNED NOT NULL,
  3.   `saldo` varchar(100) NOT NULL,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM;
  6.  
  7. INSERT INTO `a` (`id`, `saldo`) VALUES
  8. (1, '10'),
  9. (2, '15'),
  10. (5, '12'),
  11. (8, '9');
  12.  
  13. CREATE TABLE IF NOT EXISTS `b` (
  14.   `id` tinyint(2) UNSIGNED NOT NULL,
  15.   `saldo` varchar(100) NOT NULL,
  16.   PRIMARY KEY (`id`)
  17. ) ENGINE=MyISAM;
  18.  
  19. INSERT INTO `b` (`id`, `saldo`) VALUES
  20. (2, '11'),
  21. (5, '7'),
  22. (11, '19');

Prezentacja graficzna:

Oczekiwany wynik:

Teraz powinno być już wszystko jasne. Z pozoru proste zadanie ale gdy się chwilę zastanowimy to pojawia się wiele problemów. Polecam samemu pokombinować nim poczytacie dalej :)

Pierwszy wniosek jaki się nasuwa to wszelkie kombinacje INNER/LEFT/RIGHT JOIN oparte tylko na tych dwóch tabelach i relacjach między ID nie mają sensu. Owszem, te ID dotyczą tego samego obiektu ale nasze wymagania są dość specyficzne. Chcemy wyświetlić bez powtarzania wszystkie ID, bez względu na to czy istnieją w jednej czy w dwóch tabelach.

Najpierw skupmy się wyłącznie na tychże ID. Czy wiesz jakim zapytaniem wyświetlić ich listę? Jeżeli wszelkie JOIN'y odpadają to pozostaje nam połączyć wyniki poprzez użycie UNION.

SQL:
  1. SELECT id FROM a UNION SELECT id FROM b

Wynik:

Piękne w swej prostocie. Dodatkowo UNION domyślnie jest w postaci UNION DISTINCT co powoduje wywalenie duplikatów z wyników.

Po tym sukcesie chciałoby się szybko stworzyć coś takiego:

SQL:
  1. SELECT (SELECT id FROM a UNION SELECT id FROM b) AS id

Niestety, póki podzapytanie zwraca więcej niż jeden wynik to takie zapytanie zwróci błąd numer 1242: "Subquery returns more than 1 row". Mamy więc dane, które są dla nas kluczowe ale nie możemy ich wykorzystać. Gdyby tak była trzecia tabelka z tymi informacjami...

I to jest ten moment gdy powinniśmy sobie przypomnieć, że podzapytania można stosować praktycznie w każdym miejscu zapytania, również w sekcji odpowiedzialnej za wybieranie tabel. Rozwińmy nasze zapytanie:

SQL:
  1. SELECT z.id FROM (SELECT id FROM a UNION SELECT id FROM b) AS z

Wynik jest taki sam jak na ostatnim obrazku ale tym razem stworzyliśmy sobie tymczasową, wirtualną tabelę z której możemy korzystać jak i kiedy nam się podoba. Teraz mamy już naprawdę z górki. Nareszcie można użyć tak dobrze znane nam LEFT JOIN ponieważ mamy dane, które spajają obie tabele.

SQL:
  1. SELECT z.id, a.saldo AS "saldo A", b.saldo AS "saldo B" FROM (SELECT id FROM a UNION SELECT id FROM b) AS z LEFT JOIN a ON z.id = a.id LEFT JOIN b ON z.id = b.id

Wynik:

Udało się! Wyciągnęliśmy wszystkie potrzebne informacje, jednym zapytaniem. Jeszcze tylko kosmetyczne poprawki:

SQL:
  1. SELECT z.id, IFNULL(a.saldo, 0) AS "saldo A", IFNULL(b.saldo, 0) AS "saldo B" FROM (SELECT id FROM a UNION SELECT id FROM b) AS z LEFT JOIN a ON z.id = a.id LEFT JOIN b ON z.id = b.id

I mamy nasz upragniony raport:

Mam nadzieję, że ktoś czegoś się z tego nauczył :) Ja rozwiązując ten problem przypomniałem sobie możliwości nie tylko UNION i wszelkich JOIN'ów ale również szereg innych, ciekawych ale rzadko stosowanych konstrukcji SQL. Nim doszedłem do rozwiązania to nieźle kombinowałem... :)