Osoby, które udzielały się na forum lub w sb w roku 2012 |
Autor |
Wiadomość |
Dartam

Pomógł: 2 razy Posty: 185
|
Wysłany: 13-01-2013, 13:45 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? |
Ostatnio zmieniony przez Majkelo 13-01-2013, 20:51, w całości zmieniany 1 raz |
|
|
|
 |
Gadatliwa Kasia
|
|
|
|
Majkelo


Pomógł: 1283 razy Posty: 3081
|
Wysłany: 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

Pomógł: 2 razy Posty: 185
|
Wysłany: 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
Pomógł: 172 razy Posty: 480
|
Wysłany: 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

Pomógł: 2 razy Posty: 185
|
Wysłany: 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
Pomógł: 172 razy Posty: 480
|
Wysłany: 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


Pomógł: 1283 razy Posty: 3081
|
Wysłany: 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. |
|
|
|
 |
Gadatliwa Kasia
|
|
|
|
Dartam

Pomógł: 2 razy Posty: 185
|
Wysłany: 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. |
|
|
|
 |
|