[mysql] - jakie zapytanie?

0

Witam

Mam taki problem, i nie wiem jak to rozwiazać, może ktoś z was będzie wiedział, a mianowicie:

Mam 5 tableli w bazie, tabela: User, tab1, tab2, tab3 i tab4.

W tabeli user są przechowywane id i nazwa itp urzytkowników.

W tabelach tab1, tab2, tab3 i tab4 są przechowywane komentarze, recenzje itp.

I teraz jak policzyć ile kto co napisał(ma w tabelach tabX), zapytanie ma musi być dla wszytki użytkowników.

Tablela: User

id | name | ...

1 | Kubuś | ...
2 | Ktoś | ...
..

Tablela tabX

id | iduser | comment | ...

1 | 1 | moj komentarz itp..
..

w tablelach tabX pole iduser jest id użytkownika, który dodał komentarz.
Tych tabel jest 5, użytkowników ponad 2000

Skrypt ma raz na dobę wykonać takie zapytanie i sumować ilości każdemu użytkownikowi, z 5 tabel, co ile napisał.

Proszę o pomoc, jakie zapytanie najlepiej zastosować, aby nie obciążać serwera, i było względnie szybkie.

0

chcesz to w jednym zapytaniu zrobić? Jak nie koniecznie to zrobiłbym to tak:

dla każdej z tych innych tabel:

select User.id, count(User.id) from User
inner join tabX on User.id = tabX.iduser
group by User.id

Jakoś tak- nie zakładałem bazy żeby to sprawdzić ;]
Ale to zapytanie powinno zwrócić taką tabelę:

id | ilosc_rzeczy_ktore_dany_id_mial_w_tabeli_tabX

teraz 5 takich zapytań, dla każdej z tych 'innych' tabel, dodać wartości i masz ;)

0

Wielkie dzięki :),

mam tylko jeszcze jedno pytanie, czy istnieje takie zapytanie MySql żeby te otrzymane wyniki Od razu zapisało w innej tabeli, albo zaktualizowało tą inna tabele?

0

Hmm, jeśli to nie ma być jedna z tych tabeli tylko jakaś inna tabela- to powinien wystarczyć ci widok(ang. view).
Jeśli to ma być któraś z istniejących aktualizacji, to poczytaj o triggerach

0

Do tabeli user, dodałbym pole o nazwie "count", i chodzi mi o to zeby w tym polu każdemu użytkownikowi zapisywał wynik ile wszytkiego razem napisał, z tych 5 tabel tabX, przy czym np. zależność od tabeli tabX tą ilość jeszcze by pomnożył przez daną liczbę.

Np. pobiera ilość z tab1, dla każdego użytkownika i mnoż tą ilość przez 2 i zapisuje wynik w tabeli user w polu count, dla każdego.

poźniej:
pobiera ilość z tab2, dla każdego użytkownika i mnoży przez 5 i zapisuje wynik w tabeli user w polu count, dodając do już istniejącego wyniku.

i tak przez te 5 tabel.

0

Nie bardzo rozumiem, dlaczego chcesz to robić?
Zasada jest taka, żeby w bazie nie dublować danych. Zatem pole count jest niepotrzebne, bo informacje na temat ilości możesz wydobyć z bazy w aktualnej postaci.
Oczywiście nikt Ci nie broni tak zrobić. Możesz na przykład dodać pole User.ilosc_komentarz, do tego User.ilosc_recenzi i to aktualizować za każdym razem jak coś się zmieni w bazie (jak już wspomniałem za pomocą triggerów).
Jeśli nie odpowiedziałem na Twoje pytanie, to może go nie zrozumiałem. Jeśli tak- spróbuj przedstawić to jaśniej.

0
id02009 napisał(a)

Zasada jest taka, żeby w bazie nie dublować danych

jezeli zalezy nam na wydajnosci, a wydobywanie danych wiaze sie z duzym obciazeniem dla bazy, lepiej pozwolic sobie na taki "zbytek"

0
tomkiewicz napisał(a)

jezeli zalezy nam na wydajnosci, a wydobywanie danych wiaze sie z duzym obciazeniem dla bazy, lepiej pozwolic sobie na taki "zbytek"

Właśnie o to mi chodzi, w serwisie chce wprowadzić rangi użytkowników, ranga jest obliczana kto ile czego napisał w zależność w jakiej tabeli, np. tab1 to komentarze, tab2 to recenzję, tab3 to scree itd.
monożenie chcę dodać ponieważ za recenzję więcej punktów dostanie, więc ilość z tab3 * np. 4.

w skrócie powinno to wyglądać tak:

Pobież ilość rekordów z tabel tabx użytkownika z id = 1, następnie pomnoż każdą ilość przez jakaś liczbę (np. ilość z tab1 * 1, z tab2 * 2, tab3 * 5 itd...), następnie sumuj i wynik zapisz w tab user w polu count użytkownika o id = 1.

pożnie to samo dla każdego użytkownika.

Mogłbym to oczywiście zrobić że na bieŻąco (Boże, widzisz takie błędy i nie grzmisz), dane by wybierał i liczył od razu jakie mu są potrzebne, więc jeżeli wyświetlana strona wyświetla 10 komentarz z nazwą i rangą użytkownika który je dodał,musiał by policzyć dla tych 10 rangę, wyświetlen strony to ok 4000 na dobę!, więc żeby nie obciązać serwera zapisywał by raz na dobę obliczoną już rangę.

0

Zdołałem coś takiego wyczarować:

UPDATE user SET count = (SELECT COUNT(*) FROM tab1 WHERE user.id = tab1.iduser)*2+(SELECT COUNT(*) FROM tab2 WHERE user.id = tab2.iduser)*4+(SELECT COUNT(*) FROM tab3 WHERE user.id = tab3.iduser)*5+(SELECT COUNT(*) FROM tab4 WHERE user.id = tab4.iduser)*6+(SELECT COUNT(*) FROM tab5 WHERE user.id = tab5.iduser)*9;

Co wy na to zapytanie? niby jedno, ale to są chyba pod zapytania?

Niestety moje zapytanie nie działa na MySql w wersi 4.0, a taki mam na serwerze:/</b>

0

Niestety moje zapytanie nie działa na MySql w wersi 4.0, a taki mam na serwerze:/

a jakiej treści zwraca błąd?

0

PhpMyAdmin wróćił komunikat:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT(*) FROM tab1 WHERE user.id = tab

Na swoim Pc mam zainstalowany MySql 4.1 i działa.

0

może chodzi o to count(*) ?? Spróbuj zamiast * dać jakiekolwiek pole z tabeli

0

Podzapytania dostepne sa od wersji 4.1 - dlatego na serwerze nie dziala.

pozdrawiam
johny

0

No to d*** zbita :-/ ,

Może jakiś pomysł, jak to zrobić inaczej i żeby działało na MySql w wersji 4.0.

0

pl-sql ? pytanie, czy w 4.0 jest... trza by w dokumentacji sprawdzić

1 użytkowników online, w tym zalogowanych: 0, gości: 1