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?
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!!
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.
|
|
|