SQL: Zliczanie unikalnych wartości pola tabeli.

Język SQL to nie tylko genialne narzędzie pozwalające na manipulację danymi w bazie danych na stronie internetowej, ale także bardzo prosty sposób na wykonanie prostego sprawdzenia, czy pewne wartości zgadzają się z naszym stanem wiedzy. Oczywiście możliwe jest napisanie skryptu, który nam wszystko policzy, ale czy nie prościej jest stworzyć jedno zapytanie, które w bardzo czytelny sposób pokaże żądany zbiór danych? W dzisiejszym wpisie chciałbym pokazać właśnie jedno z takich przydatnych zapytań, pokazujące liczbę powtórzeń danej wartości w tabeli bazy danych.

Doctrine: Operator INDEX BY - indeksowanie wyników zapytania według wybranego pola.

Pobieranie informacji z baz(y) danych to jedna z podstawowych czynności, jaką wykonujemy podczas tworzenia różnego rodzaju stron internetowych. Aby uzyskać potrzebne dane w zdecydowanej większości przypadków wystarczy proste zapytanie SQL [w przypadku Doctrine możemy też wykorzystać język DQL]. Niektóre przypadki wymagają jednak potrzeba bardziej ambitnej ekwilibrystyki, aby przygotować odpowiedni zbiór rekordów. W dzisiejszym wpisie chciałbym pokazać jedną z możliwości biblioteki Doctrine - indeksowanie wyników zapytania według samodzielnie wybranego pola.

(My)SQL: Klauzule ORDER BY oraz LIMIT w zapytaniach z operatorem UNION.

W ciągu ostatnich tygodni naprawdę mocno pracowałem z przeróżnymi zapytaniami SQL, stąd też wynotowałem sobie kilka kwestii, które uznałem za warte opisania na blogu. Ostatnie dwa wpisy na ten temat, czyli znajdowanie rekordów sąsiednich, czy też operacje na przedziałach czasu to tylko wierzchołek góry lodowej problemów, z jakimi musiałem się zmierzyć, żeby osiągnąć zamierzony efekt. Dzisiaj chciałbym powiedzieć kilka słów na temat składni zapytań łączonych operatorem UNION - zapraszam do lektury.

SQL: Znajdowanie rekordów w przedziale czasu.

Dzisiejszy wpis ponownie będzie krótki i prosty, ponownie też podejmę temat zapytań SQL przydatnych w codziennej pracy programisty. Czym w takim razie się zajmiemy? Otóż, w związku z tym, że “czasem” musimy wykonać pewne instrukcje w zależności od istnienia bądź nieistnienia rekordów dodanych w konkretnym przedziale czasu (np. wczoraj, w ostatnim tygodniu), w tym wpisie chciałbym pokazać, jak to zrobić w prosty i przyjemny sposób. Zapraszam do lektury.

(My)SQL: Jak znaleźć poprzedni i następny rekord w jednym zapytaniu?

Pracowałem ostatnio nad skryptem galerii w jednym z projektów i w pewnym momencie natrafiłem na problem polegający na wyświetlaniu w widoku pojedynczego zdjęcia linków kierujących do następnego i poprzedniego elementu. Nie jest to pierwszy raz, kiedy zostałem zmuszony do “poradzenia sobie” z tego typu sytuacją, dlatego uznałem, że warto opisać wykorzystane rozwiązanie na blogu. Standardowo mam nadzieję, że się przyda, zatem zapraszam do lektury. ;]

(My)SQL: Aktualizowanie pola typu TIMESTAMP.

Oprogramowanie komputera zawiera w sobie wiele pułapek, o których trzeba wiedzieć, żeby w nie nie wpaść. Szczęśliwym trafem jeszcze nie miałem okazji cierpieć przez opisywany dzisiaj problem - przeczytałem o nim podczas poszukiwania informacji na temat innego, który już opisałem na niniejszym blogu. Serwer SQL, a dokładnie MySQL, to jedno z najpopularniejszych rozwiązań tej klasy, a co za tym idzie pewnego rodzaju standard. W dzisiejszym wpisie chciałbym pokazać jeden z problemów, na jaki możemy się natknąć podczas pracy z bazą danych opartą właśnie o niego.

Doctrine: Funkcje SQL w zapytaniach do bazy danych.

Od kiedy programiści stron internetowych [i nie tylko] dostali w swoje ręce pierwsze biblioteki wspomagające technikę ORM - mapowania obiektowo-relacyjnego, stało się jasne, że w bardzo wielu przypadkach oszczędzą nam one samodzielnego pisania zapytań SQL i związanych z tym problemów i błędów. Za bardzo przyjemną abstrakcją tychże bibliotek kryje się jednak jeden problem - ze względu na fakt, iż próbuje ona zastąpić nam całkowicie leżącą niżej warstwę bazy danych, bardzo często nie mamy możliwości skorzystania z natywnych funkcji SQLa. W niniejszym wpisie pokażę, jak sobie z tym poradzić wykorzystując bibliotekę ORM Doctrine.

MySQL: Błąd "#1005 - Can't create table (errno: 121)" podczas tworzenia kluczy obcych.
Powoli wyjaśnia się moja sytuacja na uczelni, także mam czas na opisywanie bardziej ambitnych problemów. Dzisiejszy wpis sponsoruje przedmiot Hurtownie i Eksploracja Danych, w ramach którego w tym semestrze naszym zadaniem było m. in. zaprojektowanie rzeczonej hurtowni. Ze względu na to, że uwielbiam przedmioty pozwalające wykorzystać posiadaną wiedzę w praktyce, z przyjemnością zająłem się wykonaniem projektu. ;] Problem: Nie ma to jak zrozumiałe nazwy błędów. Strukturę bazy danych obsługującej hurtownię projektowałem w narzędziu MySQL WorkBench, które z tego miejsca szczerze polecam - jak na darmowe oprogramowanie jest naprawdę bardzo solidnym produktem.
SQL: Operator REGEXP uwzględniający wielkość liter w wyrażeniu regularnym.

Jedną z bardzo przydatnych funkcji języka SQL, szczególnie w dialekcie MySQL, jest możliwość umieszczenia wyrażenia regularnego w klauzuli WHERE, przez co można w bardzo wygodny sposób ograniczyć zbiór rekordów, na którym operuje dane zapytanie. Jest to bardzo przydatne w przypadku pól tekstowych, gdzie mamy bardzo ograniczone pole manewru w kwestii porównywania tego typu wartości. Nie każdy jednak wie, że operator REGEXP domyślnie nie uwzględnia wielkości liter porównywanych ciągów znaków. W niniejszym wpisie chciałbym przedstawić Wam krótką poradę dotyczącą naprawy tego niedociągnięcia.

Modyfikator BINARY.

Aby zmusić operator REGEXP do porównywania pól tekstowych z uwzględnieniem wielkości liter, należy do zapytania wprowadzić modyfikator BINARY, a więc cały operator będzie brzmiał: REGEXP BINARY. Przykładowe zapytanie wykonane do bazy danych blogu: