Bazy Danych, Osobiste, szkoła etc., Programowanie (IDE, UML, Wzorce...), Systemy plików (NFS, ext3...) »

[09 stycznia, 2008 | 14 komentarzy | Poziom: 0 ]

Mimo że Subversion miało być lekiem na całe zło - szczególnie spowodowane przez CVS - to niestety nim nie jest. Nowoczesne systemy kontroli wersji mają wiele zalet. Dodatkowo nigdy nie spotkałem w nich błędów. W ostatnim moim projekcie mimo 34 rewizji(w tym 5 bezsensownych by obejść błąd SVN) błędy występowały kilkukrotnie.

Do popularnie wyskakujących błędów SVN u mnie należy 'SVN: out of data'. Co dziwniejsze operuje na file://, więc żadnych różnic czasowych nie powinno być. Jestem jedynym użytkownikiem tego repozytorium - zresztą wykonywałem przy tym svn update.

Bazy Danych, Programowanie (PHP, Java...) »

[06 stycznia, 2008 | 8 komentarzy | Poziom: 0 ]

Załóżmy, że mamy takie tabele:

  1. CREATE TABLE users (
  2.         id INTEGER PRIMARY KEY AUTOINCREMENT,
  3.         name VARCHAR(255) UNIQUE NOT NULL
  4. );
  5.  
  6. CREATE TABLE categories (
  7.         id INTEGER PRIMARY KEY AUTOINCREMENT,
  8.         name VARCHAR(255) UNIQUE NOT NULL
  9. );
  10.  
  11. CREATE TABLE posts (
  12.         id INTEGER PRIMARY KEY AUTOINCREMENT,
  13.         user_id INTEGER NOT NULL REFERENCES users(id),
  14.         category_id INTEGER NOT NULL REFERENCES categories(id),
  15.         title VARCHAR(255) UNIQUE NOT NULL,
  16.         visited INTEGER NOT NULL DEFAULT 0
  17. );

Teraz zadam proste pytanie: jak pobrać wszystkich użytkowników, którzy najpopularniejszy post był w danej kategori? Odpowiedź to chyba:

SELECT * FROM users WHERE id IN (SELECT user_id FROM posts WHERE (user_id, visited) IN (SELECT user_id, MAX(visited) FROM posts GROUP BY user_id) AND category_id = 1);
(z testów wynika, że jest to rozwiązanie poprawne)?

Zacznijmy od powiedzenia wprost, że:

  • Wyszukanie tego konkretnego kawałka SQL zajeło mi masę czasu.
  • Ktoś chcę ten kawałek ruszać? Będzię on kawałkiem niezrozumiałego, na pierwszy rzut oka, kodu.
  • W SQLite nie działa...

Czy ktoś wie, jak to zrobić prościej (zaczynam zastanawiać się nad widokami)? Bo w końcu nie wydaje się to tak niespodziewaną i skomplikowaną operacją...