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.

(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.

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:

[(My)SQL] Pobieranie identyfikatora nowego rekordu bez wykonywania zapytania INSERT.

Witajcie jeszcze raz. ;] Jak mogliście zauważyć, ostatnio znalazło się na moim blogu kilka wpisów na temat pewnych problemów z językiem SQL, a konkretnie kilku sytuacji brzegowych, w których uzyskanie interesujących nas danych okazało się nietrywialnym zadaniem. Nie inaczej będzie też dzisiaj, jako, że czytając różne materiały w serwisach związanych z programowaniem trafiłem na problem pobierania identyfikatora nowego rekordu bez wykonywania zbędnego zapytania INSERT. Nie namyślając się długo dopisałem ten problem do listy pomysłów, a dzisiaj doczekał się on realizacji. ;] Zapraszam do lektury.

Wstęp.

Żeby zobrazować problem, przyjmijmy przykładową strukturę bazy danych. Załóżmy, że mamy tabelę użytkowników, przykładowo px_users:

[(My)SQL] Sortowanie wyników według własnej listy wartości.

Język SQL kryje w sobie wiele różnych tajemnic, których znajomość może bardzo ułatwić życie programisty. Nawet podczas korzystania z jego zwykłych - “nieprogramowalnych” elementów, takich jak podstawowe zapytania CRUD [mówiąc “programowalne”, mam na myśli wszelkiego rodzaju procedury składowane i im podobne] możemy dowiedzieć się o wielu sztuczkach, które potrafią przeobrazić zwracane wyniki w gotowy zestaw danych gotowy do użycia. Mając w pamięci jeden z moich niedawnych wpisów o zwracaniu numeru rekordu, dzisiaj także chciałbym przedstawić Wam jedną z takich sztuczek.

Wstęp.

Niecałe dwa tygodnie temu stanąłem przed niemałą zagwozdką - pobierałem z tabel rekordy, których dane miały tworzyć listę w odpowiedniej kolejności. Uprzedzam pytania - w zbiorze wynikowym nie było żadnego pola “ordering”, według którego można by uszeregować te dane, a wprowadzenie go i oprogramowanie w panelu administracyjnym nie było aż tak istotne, żeby się tym zająć na poważnie. Potrzebne było rozwiązanie “na szybko”, które jednak nie powodowałoby istotnego wzrostu współczynnika WTF/min dla ewentualnych przyszłych programistów, którzy zajrzeliby do tego projektu:

[SQL] Zapytanie pobierające kolejne numery zwracanych rekordów.

Kilka dni temu, walcząc z modułem wyświetlającym menu w Joomli trafiłem na dosyć ciekawy problem: jak skonstruować zapytanie do bazy danych tak, aby jedna z kolumn w danych wynikowych została wypełniona kolejnymi numerami zwracanych rekordów? Oczywiście nie muszę mówić, że problem został pomyślnie rozwiązany, a ja zapraszam do lektury niniejszego wpisu.

Problem.

Jeśli opisane przeze mnie w nagłówku zjawisko nie jest dostatecznie zrozumiałe, postaram się opisać to na przykładzie. Weźmy pod uwagę tabelę: