To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

Bazy danych SQL - Osoby, które udzielały się na forum lub w sb w roku 2012

Dartam - 13-01-2013, 13:45
Temat postu: Osoby, które udzielały się na forum lub w sb w roku 2012
Witam,
czy mógłby mi ktoś powiedzieć jak napisać kod SQL, który wypisywałby nicki osób, które chodź raz napisały wiadomość na forum bądź na ShoutBoxie w roku 2012? :mrgreen:

Majkelo - 13-01-2013, 20:42

Kod:
SELECT u.user_id, u.username, p.post_time, s.sb_user_id, p.poster_id, s.timestamp
FROM `phpbb_users` u
LEFT JOIN `phpbb_posts` p ON u.user_id = p.poster_id
LEFT JOIN `phpbb_shoutbox` s ON s.sb_user_id = u.user_id
WHERE p.post_time >= 1325372400
AND p.post_time <= 1356994800
OR s.timestamp >= 1325372400
AND s.timestamp <= 1356994800
HAVING count( p.post_time ) >0
OR COUNT( s.sb_user_id ) >0;


Wydaje mi się, że nie zrobiłem nigdzie byka. Wykonaj w PHPMYADMIN i sprawdź czy dane rzeczywiście są właściwe.

Dartam - 17-01-2013, 00:43

Miałem problemy z wykonaniem tego zapytania, bo serwer się przeciążał, ale pokombinowałem i się udało. Tylko teraz jest problem innej natury. Zwrócony wynik jest jednak nieprawidłowy, tzn. zwróciło mi tylko jednego użytkownika i do tego, który nie wypowiedział się nigdzie w 2012 roku.

http://i.imgur.com/TMfSh.jpg - tak to wygląda

MQs - 17-01-2013, 02:46

Liczenie i brak grupowania zarzyna bazę. To zapytanie powinno działać:
Kod:
SELECT u.username, u.user_id, p.post_time, s.timestamp
FROM `phpbb_users` u
LEFT JOIN `phpbb_posts` p ON u.user_id = p.poster_id
LEFT JOIN `phpbb_shoutbox` s ON s.sb_user_id = u.user_id
WHERE (p.post_time >=1325372400 AND p.post_time <=1356994800)
OR (s.timestamp >=1325372400 AND s.timestamp <=1356994800)
AND u.user_id <> -1
GROUP BY u.username

Po SELECT możesz zostawić samo u.username jeśli chcesz tylko nicki - id jest do ewentualnie dalszych operacji, a dwie ostatnie dla sprawdzenia (nie mogą być NULL jednocześnie).

Dartam - 17-01-2013, 14:07

Działa gitnie, tylko jeden problem. Zwrócony wynik to 30 rekordów na 5 listach i jak kliknę na 2 listę, to zapytanie wykonuję się od nowa a to trwa 1745s czyli pół godziny. Co trzeba dopisać, żeby zwrócony wynik pokazywał się na jednej liście?

EDIT: Dobra już wiem "LIMIT 0 , 1000". Dzięki wielkie za pomoc!! :mrgreen:

MQs - 17-01-2013, 14:30

Coś strasznie długo ci to składa- u mnie to ok.11sek (też 1.12.6p4 podobna liczba userów/postów - wynik 1000 rekordów).
limit jest z phpMyAdmin - możesz dodać na końcu zapytania LIMIT 1000, ale u ciebie jest coś nie tak i nie kombinuj z takim zapytaniem na aktywnej bazie - zrób import bazy i sprawdź sobie na localhost. Nie wiem czy to kwestia wersji (może tabele się nie zgadzają), ale na localu i tej samej bazie + update na 1.12.7 zapytanie trwa 1 sek.

Majkelo - 17-01-2013, 15:03

Przy sporej bazie, wykonywanie zapytania będzie po prostu długie i mało przyjemne dla bazy bo sporo jest do przekopania informacji w tej bazie. Jeśli to ma być jakiś dodatek czy coś to pomyśl nad cachowaniem rekordów.
Dartam - 17-01-2013, 15:40

Własnie sprawdzałem na localhoscie, bo na serwerze nie chciałem ruszać plików konfiguracyjnych. Raczej to wina tabeli shoutboxa, bo nie usuwam w ogóle wiadomości (dla archiwum) i jest ona dość spora, ma przeszło 220.000 rekordów. Ważne ze wynik jest prawidłowy i mam to co chciałem. Jeszcze raz wielkie dzięki. :)


Powered by phpBB modified by Przemo © 2003 phpBB Group